rlox/GRAMMAR

49 lines
1.8 KiB
Text
Raw Normal View History

2023-01-22 23:33:57 +01:00
program -> statement* EOF ;
2023-01-20 16:10:03 +01:00
2023-01-25 19:01:13 +01:00
statement -> if_stmt
| print_stmt
| while_stmt
| for_stmt
| declaration
| block
| expr_stmt
| break
| return_stmt ;
2023-01-22 23:33:57 +01:00
2023-01-25 19:01:13 +01:00
if_stmt -> "if" "(" expression ")" statement ( "else" statement )? ;
print_stmt -> "print" expression ";" ;
while_stmt -> "while" "(" expression ")" statement ;
for_stmt -> "for" "(" (declaration | expr_stmt | ";") ";" expression? ";" expression ";" ")" statement ;
2023-01-22 23:33:57 +01:00
block -> "{" statement* "}" ;
2023-01-25 19:01:13 +01:00
expr_Stmt -> expression ";" ;
break -> "break" ";" ;
return -> "return" expression? ";" ;
declaration -> var_decl | fun_decl | class_decl ;
2023-01-25 19:01:13 +01:00
var_decl -> "var" IDENTIFIER ( "=" expression )? ";"
fun_decl -> "fun" IDENTIFIER "(" parameters ")" block ;
2023-01-28 14:19:12 +01:00
class_decl -> "class" IDENTIFIER ( "<" IDENTIFIER ) "{" method* "}" ;
method -> IDENTIFIER "(" parameters ")" block ;
2023-01-22 23:33:57 +01:00
expression -> assignment
2023-01-28 14:19:12 +01:00
assignment -> ( call_or_get "." )? IDENTIFIER "=" assignment | logic_or ;
2023-01-25 19:01:13 +01:00
logic_or -> logic_and ( "or" logic_and )* ;
logic_and -> equality ( "and" equality )* ;
2023-01-20 16:10:03 +01:00
equality -> comparison ( ( "==" | "!=" ) comparison )* ;
comparison -> term ( ">" | ">=" | "<" | "<=" term )* ;
term -> factor ( ( "+" | "-" ) factor )*
factor -> unary ( ( "*" | "/" ) unary )* ;
2023-01-28 14:19:12 +01:00
unary -> ( "!" | "-" ) unary | call_or_get ;
2023-01-25 19:01:13 +01:00
2023-01-28 14:19:12 +01:00
call_or_get -> primary ( "(" arguments? ")" | "." IDENTIFIER )* ;
2023-01-25 19:01:13 +01:00
arguments -> expression ( "," expression )* ;
2023-01-28 14:19:12 +01:00
primary -> "(" expression ")" | IDENTIFIER | lambda | NUMBER | STRING | "true" | "false" | "nil"
| "this" | "super" "." IDENTIFIER ;
2023-01-25 19:01:13 +01:00
lambda -> "fun" "(" parameters ")" block ;
2023-01-25 19:01:13 +01:00
parameters -> ( IDENTIFIER ( "," IDENTIFIER )* )? ;