packages feed

peg-matching-0.1.0.0: input/peg/tarefa6.peg

file <- line+

line      <- statement / comment newline / blank newline
statement <- compound / simple blank comment? newline?

compound <- if_stmt / while_stmt

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)

simple        <- import_stmt / assignment / expression
import_stmt   <- simple_import / from_import
simple_import <- "import" blank identifier
from_import   <- "from" blank identifier blank "import" blank (id_list / "*")

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 / atom
function_call <- identifier blank "(" blank expr_list? 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)*

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"