root ::= (declaration)* | |
declaration ::= dataType identifier "(" parameter? ")" "{" statement* "}" | |
dataType ::= "int" ws | "float" ws | "char" ws | |
identifier ::= [a-zA-Z_] [a-zA-Z_0-9]* | |
parameter ::= dataType identifier | |
statement ::= | |
( dataType identifier ws "=" ws expression ";" ) | | |
( identifier ws "=" ws expression ";" ) | | |
( identifier ws "(" argList? ")" ";" ) | | |
( "return" ws expression ";" ) | | |
( "while" "(" condition ")" "{" statement* "}" ) | | |
( "for" "(" forInit ";" ws condition ";" ws forUpdate ")" "{" statement* "}" ) | | |
( "if" "(" condition ")" "{" statement* "}" ("else" "{" statement* "}")? ) | | |
( singleLineComment ) | | |
( multiLineComment ) | |
forInit ::= dataType identifier ws "=" ws expression | identifier ws "=" ws expression | |
forUpdate ::= identifier ws "=" ws expression | |
condition ::= expression relationOperator expression | |
relationOperator ::= ("<=" | "<" | "==" | "!=" | ">=" | ">") | |
expression ::= term (("+" | "-") term)* | |
term ::= factor(("*" | "/") factor)* | |
factor ::= identifier | number | unaryTerm | funcCall | parenExpression | |
unaryTerm ::= "-" factor | |
funcCall ::= identifier "(" argList? ")" | |
parenExpression ::= "(" ws expression ws ")" | |
argList ::= expression ("," ws expression)* | |
number ::= [0-9]+ | |
singleLineComment ::= "//" [^\n]* "\n" | |
multiLineComment ::= "/*" ( [^*] | ("*" [^/]) )* "*/" | |
ws ::= ([ \t\n]+) | |