peg-matching-0.1.0.0: input/peg/python.peg
file <- (blank* newline)* statement+
-- TODO: Será que faz sentido isso? Um comentário ser uma declaração?
statement <- (compound / simple / comment) blank* newline*
compound <- function_def / if_stmt / while_stmt / for_stmt
function_def <- ("def" space identifier "(" space id_list? ")" space ":") > statement
if_stmt <- (("if" space expression ":") > statement) (elif_block / else_block)?
elif_block <- (("elif" space expression ":") > statement) (elif_block / else_block)?
else_block <- ("else" space ":") > statement
while_stmt <- ("while" space expression space ":") > statement
for_stmt <- ("for" space identifier space "in" space expression ":") > statement
simple <- import_stmt / assignment / return_stmt / expression
return_stmt <- "return" space expr_list
import_stmt <- simple_import / from_import
simple_import <- "import" space identifier
from_import <- "from" space identifier space "import" space (id_list / "*")
assignment <- id_list space attr space expression
attr <- "=" / "+=" / "-=" / "*=" / "/="
expression <- or_expr ("or" space or_expr)*
or_expr <- and_expr ("and" space and_expr)*
and_expr <- "not" space comparison / comparison
comparison <- sum (op_comp sum)*
sum <- term (op_term term)*
term <- factor (op_factor factor)*
factor <- power (op_power power)*
power <- "-" neg / neg
neg <- primary space / "(" space expression ")" space
op_comp <- ("==" / "!=" / "<=" / ">=" / "<" / ">") space
op_term <- ("+" / "-") space
op_factor <- ("*" / "/" / "%") space
op_power <- "**" space
primary <- function_call / array_access / "[" items? "]" / atom
function_call <- identifier space "(" space expr_list? ")" ("." primary)?
-- function_call <- identifier "(" expr_list? ")"
array_access <- identifier space "[" space expression "]" ("." primary)?
atom <- "True" / "False" / "None" / number / strings / identifier
expr_list <- expr1 space (sep expr1 space)*
expr1 <- (single_id space "=" space)? expression
items <- expression (sep expression space)*
id_list <- identifier space (sep identifier space)*
sep <- "," space
^strings <- fstring / string
fstring <- "f" string
string <- ['] (!['] char)* ['] / ["] (!["] char)* ["]
-- TODO: Fazer uma forma mais fácil
char <- [a-zA-Z0-9 :{}.,;^+-*/%()_!?áéúçã] / "[" / "]"
^identifier <- single_id ("." single_id)*
single_id <- [a-zA-Z] [a-zA-Z0-9_]*
^number <- [0-9]+
space <- " "*
^blank <- comment / " "
^comment <- "#" char*
^newline <- "\r\n" / "\r" / "\n"