Untitled
unknown
plain_text
a year ago
1.7 kB
9
Indexable
grammar ArithGrammer;
program : prog;
prog : func_list ;
func_list : func_def func_list
| func_def
;
func_def : data_type ID '(' param_list ')' code_block
;
param_list : param ',' param_list
| param
| // epsilon
;
param : data_type ID ;
data_type : 'int' | 'double' | 'boolean' | 'void' ;
code_block : '{' stmt_list '}' ;
stmt_list : stmt stmt_list
|
;
stmt : ';'
| code_block
| data_type var_list ';'
| ID '=' expr ';'
| ID '++' ';'
| ID '--' ';'
| 'return' ';'
| 'return' expr ';'
| decide '(' expr ')' stmt
| decide '(' expr ')' stmt ('else' stmt)?
| expr ';'
| loop_stmt
| init_stmt ';'
;
decide : 'if';
loop_stmt : 'while' '(' expr ')' stmt
;
init_stmt : data_type ID '=' expr
;
var_list : var ',' var_list
| var
;
var : ID
|ID '=' expr
;
expr : number
| ID
| 'true'
| 'false'
| STRING
| ID '(' args ')'
| '(' expr ')'
| unop number
| number binop number
;
args : expr ',' args
| expr
|
;
unop : '-'
| '!'
;
binop : ( '*' | '/' | '%' )
| ( '+' | '-' )
| ( '<' | '>' | '<=' | '>=' )
| ( '==' | '!=' )
| '&&'
| '||'
;
number : INTEGER | DOUBLE ;
// Lexer rules
INTEGER : '0' | [1-9] [0-9]*;
DOUBLE : INTEGER '.' ([0-9])+;
ID : [a-zA-Z_] ([a-zA-Z_] | [0-9])*;
STRING : '"' .*? '"';
WS : [ \t\r\n]+ -> skip;
COMMENT : '//' ~[\r\n]* -> skip;
BLOCK_COMMENT : '/*' .*? '*/' -> skip;
// Handle errors
ERROR : . -> channel(HIDDEN);Editor is loading...
Leave a Comment