peg-matching-0.1.0.0: input/peg/tarefa12.peg
file <- line+
line <- statement / comment newline / blank newline
statement <- compound / simple blank comment? newline?
compound <- if_stmt / while_stmt / for_stmt / function_def
function_def <- ("def" blank identifier blank "(" blank id_list? blank ")" blank ":" blank comment?) > line
if_stmt <- (("if" blank expression blank ":" blank comment?) > line) (elif_stmt / else_stmt)?
elif_stmt <- (("elif" blank expression blank ":" blank comment?) > line) (elif_stmt / else_stmt)?
else_stmt <- ("else" blank ":" blank comment?) > line
while_stmt <- ("while" blank expression blank ":" blank comment?) > line
for_stmt <- ("for" blank identifier blank "in" blank expression blank ":" blank comment?) > line
simple <- import_stmt / assignment / return_stmt / expression
import_stmt <- simple_import / from_import
simple_import <- "import" blank identifier
from_import <- "from" blank identifier blank "import" blank (id_list / "*")
return_stmt <- "return" blank (expr_list / "(" blank expr_list blank ")")
assignment <- id_list blank attr blank expression
attr <- "=" / "+=" / "-=" / "*=" / "/="
expression <- or_expr (blank "or" blank or_expr)*
or_expr <- and_expr (blank "and" blank and_expr)*
and_expr <- "not" blank comparison / comparison
comparison <- sum (blank op_comp blank sum)*
sum <- term (blank op_term blank term)*
term <- factor (blank op_factor blank factor)*
factor <- power (blank op_power blank power)*
power <- ("-" / "+") signed / signed
signed <- primary / "(" blank expression blank ")"
op_comp <- ("==" / "!=" / "<=" / ">=" / "<" / ">")
op_term <- ("+" / "-")
op_factor <- ("*" / "//" / "/" / "%")
op_power <- "**"
primary <- function_call / array_access / "[" blank items? blank "]" / atom
function_call <- identifier blank "(" blank expr_list? blank ")"
array_access <- identifier (blank "[" blank expression blank "]")+
atom <- "True" / "False" / "None" / number / strings / identifier
expr_list <- expr1 (blank sep expr1)*
expr1 <- (single_id blank "=" blank)? expression
id_list <- identifier (blank sep identifier)*
items <- expression (blank sep expression)*
sep <- "," blank
^strings <- fstring / string
fstring <- "f" string
string <- ['] (!['] char)* ['] / ["] (!["] char)* ["]
-- TODO: Fazer uma forma mais fácil
char <- [a-zA-Z0-9 :{}.,;=^~+-*/%$<>()_!?#\t\\áéíóúãõâêôàçÁÉÍÓÚÃÕÂÊÔÀÇ'"ẽĩũîûẼĨŨÎÛ] / "[" / "]"
^identifier <- single_id ("." single_id)*
single_id <- [a-zA-Z] [a-zA-Z0-9_]*
^number <- [0-9]+ ("." [0-9]+)?
^blank <- space*
space <- " " / "\t"
^comment <- "#" char*
^newline <- "\r\n" / "\r" / "\n"