update grammar to remove more junk + upate tests + codegen
This commit is contained in:
@ -61,25 +61,27 @@ compare_op[promote] -> LESS | LESS_EQUAL | GREATER | GREATER_EQUAL | EQUAL | NOT
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
|
||||
// START -> class IDENTIFIER { class_cnt }
|
||||
S[promote] -> CLASS IDENTIFIER L_BRACE class_cnt R_BRACE | eps
|
||||
S[renameto=CLASS delchild=CLASS,R_BRACE,L_BRACE] -> CLASS IDENTIFIER L_BRACE class_cnt R_BRACE | eps
|
||||
|
||||
// class_cnt -> public static void main(String[] args) { block_cnt }
|
||||
class_cnt[promote delifempty] -> PUBLIC STATIC VOID_TYPE IDENTIFIER_MAIN L_PAREN STRING_TYPE L_BRACKET R_BRACKET IDENTIFIER R_PAREN L_BRACE block_cnt R_BRACE | eps
|
||||
// remove all the stuff that is irrelevant to this simple case
|
||||
class_cnt[promote delifempty delchild=L_BRACE,R_BRACE,L_PAREN,R_PAREN,L_BRACKET,R_BRACKET,IDENTIFIER,IDENTIFIER_MAIN,STRING_TYPE,VOID_TYPE,STATIC,PUBLIC] -> PUBLIC STATIC VOID_TYPE IDENTIFIER_MAIN L_PAREN STRING_TYPE L_BRACKET R_BRACKET IDENTIFIER R_PAREN L_BRACE block_cnt R_BRACE | eps
|
||||
|
||||
// block_ccnt -> stuff in {} | list of statements
|
||||
block_cnt[promote delifempty] -> statement block_cnt | L_BRACE block_cnt R_BRACE | eps
|
||||
|
||||
// statement -> stuff ending with ; | loop | condition
|
||||
statement[promote] -> stmt SEMICOLON | loop | cond
|
||||
statement[promote delchild=SEMICOLON] -> stmt SEMICOLON | loop | cond
|
||||
stmt[promote] -> print | declaration | assignment
|
||||
print -> PRINTLN par_expr
|
||||
print[nametoval=PRINTLN] -> PRINTLN par_expr
|
||||
|
||||
// declaration -> type IDENTIFIER = expr;
|
||||
declaration[nametoval=INTEGER_TYPE,BOOLEAN_TYPE,STRING_TYPE] -> type assignment
|
||||
assignment[delchild=ASSIGN valtoval=IDENTIFIER] -> IDENTIFIER ASSIGN expr
|
||||
|
||||
// par_expr -> ( expr )
|
||||
par_expr -> L_PAREN expr R_PAREN
|
||||
// dont [promote] par_expr to make parenthesis-precedence easier
|
||||
par_expr[delchild=L_PAREN,R_PAREN] -> L_PAREN expr R_PAREN
|
||||
|
||||
// expr -> expression that returns something | literal
|
||||
expr[promote nametoval=ADD,SUB,MUL,DIV,MOD,AND,OR,NOT,LESS,LESS_EQUAL,GREATER,GREATER_EQUAL,EQUAL,NOT_EQUAL] -> expr_f expr_2
|
||||
@ -87,7 +89,8 @@ expr_2[promote delifempty renameto=expr] -> op expr_f expr_2 | eps
|
||||
expr_f[promote renameto=expr] -> unary expr_f | par_expr | val
|
||||
|
||||
// Control-Flow
|
||||
// Don't [delifempty] single_or_braced to make it easier to get the expression
|
||||
loop[delchild=WHILE] -> WHILE par_expr single_or_braced
|
||||
cond[delchild=IF] -> IF par_expr single_or_braced cond_else
|
||||
cond_else[delifempty delchild=ELSE] -> ELSE single_or_braced | eps
|
||||
single_or_braced -> L_BRACE block_cnt R_BRACE | stmt SEMICOLON
|
||||
single_or_braced[promote delchild=L_BRACE,R_BRACE] -> L_BRACE block_cnt R_BRACE | stmt SEMICOLON
|
||||
|
Reference in New Issue
Block a user