From 6c262625e419f02bf25660f1ac6d77d0d0b3504b Mon Sep 17 00:00:00 2001 From: Alexandre Bique Date: Sun, 5 Apr 2009 00:59:40 +0100 Subject: [PATCH] [mugiwara] easier parser to read --- src/plugins/lang/mugiwara/bison-parser/lexer.l | 52 +++++----- src/plugins/lang/mugiwara/bison-parser/parser.y | 132 ++++++++++++------------ 2 files changed, 91 insertions(+), 93 deletions(-) diff --git a/src/plugins/lang/mugiwara/bison-parser/lexer.l b/src/plugins/lang/mugiwara/bison-parser/lexer.l index 79d0187..3fe6a01 100644 --- a/src/plugins/lang/mugiwara/bison-parser/lexer.l +++ b/src/plugins/lang/mugiwara/bison-parser/lexer.l @@ -40,48 +40,48 @@ makeFloat(double value); \/\/.*$ /* line comment */ #.*$ /* line comment */ -; return SEMICOL; -\. return DOT; -: return DDOT; -, return COMMA; +; return ';'; +\. return '.'; +: return ':'; +, return ','; -= return EQ; += return '='; == return EQEQ; != return NEQ; -\< return LT; +\< return '<'; \<= return LTEQ; -> return GT; +> return '>'; >= return GTEQ; -\( return LPAR; -\) return RPAR; +\( return '('; +\) return ')'; -\[ return LSB; -\] return RSB; +\[ return '['; +\] return ']'; -\{ return LBR; -\} return RBR; +\{ return '{'; +\} return '}'; -\+ return ADD; -- return SUB; -\* return STAR; -\/ return DIV; -% return MOD; +\+ return '+'; +- return '-'; +\* return '*'; +\/ return '/'; +% return '%'; -\| return OR; -& return AND; -\^ return XOR; +\| return '|'; +& return '&'; +\^ return '^'; \<\< return SHL; >> return LSHR; >>> return ASHR; -~ return NOT; +~ return '~'; -! return BANG; +! return '!'; \|\| return OROR; && return ANDAND; -@ return AT; -\$ return DOLLAR; +@ return '@'; +\$ return '$'; \"[^\"]*\" return STRING; @@ -124,7 +124,7 @@ false MAKE_BOOL(0); return NUMBER; } -. assert(false); return 0; +. return *yytext; %% diff --git a/src/plugins/lang/mugiwara/bison-parser/parser.y b/src/plugins/lang/mugiwara/bison-parser/parser.y index 32b9934..66da581 100644 --- a/src/plugins/lang/mugiwara/bison-parser/parser.y +++ b/src/plugins/lang/mugiwara/bison-parser/parser.y @@ -121,14 +121,24 @@ createType(const char * name) %token NUMBER %token ID STRING -%token EQ SEMICOL DOT DDOT COMMA -%token EQEQ LT LTEQ GT GTEQ NEQ -%token ADD SUB DIV STAR MOD AT DOLLAR -%token OR AND XOR SHL ASHR LSHR -%token NOT BANG OROR ANDAND -%token LPAR RPAR LBR RBR LSB RSB -%token GOTO CONST CAST RETURN -%token IF ELSE WHILE DO FOR +%token EQEQ "==" +%token NEQ "!=" +%token LTEQ "<=" +%token GTEQ ">=" +%token SHL "<<" +%token ASHR ">>>" +%token LSHR ">>" +%token OROR "||" +%token ANDAND "&&" +%token GOTO "goto" +%token CONST "const" +%token CAST "cast" +%token RETURN "return" +%token IF "if" +%token ELSE "else" +%token WHILE "while" +%token DO "do" +%token FOR "for" %type decls %type decl @@ -168,13 +178,13 @@ decl: func_dec { $$ = $1; }; -func_dec: type ID LPAR func_params RPAR SEMICOL { +func_dec: type ID '(' func_params ')' ';' { ozulis::ast::FunctionDecl * func = new ozulis::ast::FunctionDecl; func->returnType = $1; func->name = $2; func->args = $4; $$ = func; -} | type ID LPAR func_params RPAR block { +} | type ID '(' func_params ')' block { ozulis::ast::Function * func = new ozulis::ast::Function; func->returnType = $1; func->name = $2; @@ -189,18 +199,18 @@ func_params: func_params_non_empty { $$ = $1; } func_params_non_empty: var_decl { $$ = new std::vector(); $$->push_back($1); -} | func_params_non_empty COMMA var_decl { +} | func_params_non_empty ',' var_decl { $$ = $1; $$->push_back($3); }; -block: LBR var_decls statements RBR { +block: '[' var_decls statements ']' { $$ = new ozulis::ast::Block(); $$->varDecls = $2; $$->statements = $3; }; -var_decls: var_decls var_decl SEMICOL { +var_decls: var_decls var_decl ';' { assert($2); $$ = $1 ? : new std::vector (); $$->push_back($2); @@ -226,26 +236,26 @@ statement: exp_statement { $$ = $1; } | do_while_statement { $$ = $1; } | return_statement { $$ = $1; } | block { $$ = $1; } -| SEMICOL { $$ = new ozulis::ast::EmptyStatement(); }; +| ';' { $$ = new ozulis::ast::EmptyStatement(); }; -exp_statement: exp SEMICOL { +exp_statement: exp ';' { assert($1); $$ = $1; }; -label_statement: ID DDOT { +label_statement: ID ':' { ozulis::ast::Label * label = new ozulis::ast::Label(); label->name = $1; $$ = label; }; -goto_statement: GOTO ID SEMICOL { +goto_statement: "goto" ID ';' { ozulis::ast::Goto * gt = new ozulis::ast::Goto(); gt->label = $2; $$ = gt; }; -if_statement: IF LPAR exp RPAR statement else_statement { +if_statement: "if" '(' exp ')' statement else_statement { ozulis::ast::If * ifStmt = new ozulis::ast::If(); assert($3); assert($5); @@ -257,11 +267,11 @@ if_statement: IF LPAR exp RPAR statement else_statement { $$ = ifStmt; }; -else_statement: ELSE statement { +else_statement: "else" statement { $$ = $2; } | /* epsylon */ { $$ = new ozulis::ast::EmptyStatement; }; -while_statement: WHILE LPAR exp RPAR statement { +while_statement: "while" '(' exp ')' statement { ozulis::ast::While * whileStmt = new ozulis::ast::While; assert($3); assert($5); @@ -271,7 +281,7 @@ while_statement: WHILE LPAR exp RPAR statement { $$ = whileStmt; }; -do_while_statement: DO statement WHILE LPAR exp RPAR SEMICOL { +do_while_statement: "do" statement "while" '(' exp ')' ';' { ozulis::ast::DoWhile * doWhileStmt = new ozulis::ast::DoWhile; assert($2); assert($5); @@ -281,12 +291,12 @@ do_while_statement: DO statement WHILE LPAR exp RPAR SEMICOL { $$ = doWhileStmt; }; -return_statement: RETURN SEMICOL { +return_statement: "return" ';' { ozulis::ast::Return * ret = new ozulis::ast::Return; ret->exp = new ozulis::ast::VoidExp; ret->exp->type = new ozulis::ast::VoidType; $$ = ret; -} | RETURN exp SEMICOL { +} | "return" exp ';' { ozulis::ast::Return * ret = new ozulis::ast::Return; ret->exp = $2; $$ = ret; @@ -297,11 +307,11 @@ type: ID { } | CONST type { $2->isConst = true; $$ = $2; -} | AT type { +} | '@' type { ozulis::ast::PointerType * type = new ozulis::ast::PointerType; type->type = $2; $$ = type; -} | LSB NUMBER COMMA type RSB { +} | '{' NUMBER ',' type '}' { ozulis::ast::ArrayType * type = new ozulis::ast::ArrayType; type->type = $4; type->size = $2->number; @@ -313,48 +323,48 @@ exp: assign_exp { $$ = $1; }; -assign_exp: exp EQ oror_exp { +assign_exp: exp '=' oror_exp { ozulis::ast::AssignExp * exp = new ozulis::ast::AssignExp(); exp->dest = $1; exp->value = $3; $$ = exp; } | oror_exp { assert($1); $$ = $1; }; -oror_exp: oror_exp OROR andand_exp { MAKE_BINARY_EXP(OrOrExp, $$, $1, $3); } +oror_exp: oror_exp "||" andand_exp { MAKE_BINARY_EXP(OrOrExp, $$, $1, $3); } | andand_exp { assert($1); $$ = $1; }; -andand_exp: andand_exp ANDAND or_exp { MAKE_BINARY_EXP(AndAndExp, $$, $1, $3); } +andand_exp: andand_exp "&&" or_exp { MAKE_BINARY_EXP(AndAndExp, $$, $1, $3); } | or_exp { assert($1); $$ = $1; }; -or_exp: or_exp OR xor_exp { MAKE_BINARY_EXP(OrExp, $$, $1, $3); } +or_exp: or_exp '|' xor_exp { MAKE_BINARY_EXP(OrExp, $$, $1, $3); } | xor_exp { assert($1); $$ = $1; }; -xor_exp: xor_exp XOR and_exp { MAKE_BINARY_EXP(XorExp, $$, $1, $3); } +xor_exp: xor_exp '^' and_exp { MAKE_BINARY_EXP(XorExp, $$, $1, $3); } | and_exp { assert($1); $$ = $1; }; -and_exp: and_exp AND cmp_exp { MAKE_BINARY_EXP(AndExp, $$, $1, $3); } +and_exp: and_exp '&' cmp_exp { MAKE_BINARY_EXP(AndExp, $$, $1, $3); } | cmp_exp { assert($1); $$ = $1; }; -cmp_exp: shift_exp EQEQ shift_exp { MAKE_BINARY_EXP(EqExp, $$, $1, $3); } -| shift_exp NEQ shift_exp { MAKE_BINARY_EXP(NeqExp, $$, $1, $3); } -| shift_exp LT shift_exp { MAKE_BINARY_EXP(LtExp, $$, $1, $3); } -| shift_exp LTEQ shift_exp { MAKE_BINARY_EXP(LtEqExp, $$, $1, $3); } -| shift_exp GT shift_exp { MAKE_BINARY_EXP(GtExp, $$, $1, $3); } -| shift_exp GTEQ shift_exp { MAKE_BINARY_EXP(GtEqExp, $$, $1, $3); } +cmp_exp: shift_exp "==" shift_exp { MAKE_BINARY_EXP(EqExp, $$, $1, $3); } +| shift_exp "!=" shift_exp { MAKE_BINARY_EXP(NeqExp, $$, $1, $3); } +| shift_exp '<' shift_exp { MAKE_BINARY_EXP(LtExp, $$, $1, $3); } +| shift_exp "<=" shift_exp { MAKE_BINARY_EXP(LtEqExp, $$, $1, $3); } +| shift_exp '>' shift_exp { MAKE_BINARY_EXP(GtExp, $$, $1, $3); } +| shift_exp ">=" shift_exp { MAKE_BINARY_EXP(GtEqExp, $$, $1, $3); } | shift_exp { assert($1); $$ = $1; }; -shift_exp: shift_exp SHL add_exp { MAKE_BINARY_EXP(ShlExp, $$, $1, $3); } -| shift_exp ASHR add_exp { MAKE_BINARY_EXP(AShrExp, $$, $1, $3); } -| shift_exp LSHR add_exp { MAKE_BINARY_EXP(LShrExp, $$, $1, $3); } +shift_exp: shift_exp "<<" add_exp { MAKE_BINARY_EXP(ShlExp, $$, $1, $3); } +| shift_exp ">>>" add_exp { MAKE_BINARY_EXP(AShrExp, $$, $1, $3); } +| shift_exp ">>" add_exp { MAKE_BINARY_EXP(LShrExp, $$, $1, $3); } | add_exp { assert($1); $$ = $1; }; -add_exp: add_exp ADD mul_exp { MAKE_BINARY_EXP(AddExp, $$, $1, $3); } -| add_exp SUB mul_exp { MAKE_BINARY_EXP(SubExp, $$, $1, $3); } +add_exp: add_exp '+' mul_exp { MAKE_BINARY_EXP(AddExp, $$, $1, $3); } +| add_exp '-' mul_exp { MAKE_BINARY_EXP(SubExp, $$, $1, $3); } | mul_exp { assert($1); $$ = $1; }; -mul_exp: mul_exp STAR unary_exp { MAKE_BINARY_EXP(MulExp, $$, $1, $3); } -| mul_exp DIV unary_exp { MAKE_BINARY_EXP(DivExp, $$, $1, $3); } -| mul_exp MOD unary_exp { MAKE_BINARY_EXP(ModExp, $$, $1, $3); } +mul_exp: mul_exp '*' unary_exp { MAKE_BINARY_EXP(MulExp, $$, $1, $3); } +| mul_exp '/' unary_exp { MAKE_BINARY_EXP(DivExp, $$, $1, $3); } +| mul_exp '%' unary_exp { MAKE_BINARY_EXP(ModExp, $$, $1, $3); } | unary_exp { assert($1); $$ = $1; }; unary_exp: NUMBER { $$ = $1; } @@ -367,34 +377,34 @@ unary_exp: NUMBER { $$ = $1; } ozulis::ast::StringExp * exp = new ozulis::ast::StringExp; exp->string = $1; $$ = exp; -} | LPAR exp RPAR { assert($2); $$ = $2; } -| BANG unary_exp { MAKE_UNARY_EXP(BangExp, $$, $2); } -| NOT unary_exp { MAKE_UNARY_EXP(NotExp, $$, $2); } -| SUB unary_exp { MAKE_UNARY_EXP(NegExp, $$, $2); } +} | '(' exp ')' { assert($2); $$ = $2; } +| '!' unary_exp { MAKE_UNARY_EXP(BangExp, $$, $2); } +| '~' unary_exp { MAKE_UNARY_EXP(NotExp, $$, $2); } +| '-' unary_exp { MAKE_UNARY_EXP(NegExp, $$, $2); } | call_exp { $$ = $1; } -| CAST LPAR type COMMA exp RPAR { +| "cast" '(' type ',' exp ')' { ozulis::ast::CastExp * cast = new ozulis::ast::CastExp; assert($3); assert($5); cast->type = $3; cast->exp = $5; $$ = cast; -} | unary_exp DOLLAR { +} | unary_exp '$' { ozulis::ast::DereferenceExp * exp = new ozulis::ast::DereferenceExp; exp->exp = $1; $$ = exp; -} | AT unary_exp { +} | '@' unary_exp { ozulis::ast::AtExp * exp = new ozulis::ast::AtExp; exp->exp = $2; $$ = exp; -} | unary_exp LSB exp RSB { +} | unary_exp '{' exp '}' { ozulis::ast::DereferenceByIndexExp * exp = new ozulis::ast::DereferenceByIndexExp; exp->exp = $1; exp->index = $3; $$ = exp; }; -call_exp: ID LPAR call_exp_args RPAR { +call_exp: ID '(' call_exp_args ')' { assert($1); assert($3); @@ -411,7 +421,7 @@ call_exp_args_non_empty: exp { assert($1); $$ = new std::vector(); $$->push_back($1); -} | call_exp_args_non_empty COMMA exp { +} | call_exp_args_non_empty ',' exp { assert($1); assert($3); $1->push_back($3); @@ -419,15 +429,3 @@ call_exp_args_non_empty: exp { }; %% - -#ifdef WITH_MAIN -int main(void) -{ - void *exp; - yyscan_t scanner; - - yylex_init(&scanner); - yyparse(scanner, &exp); - return 0; -} -#endif /* WITH_MAIN */ -- 2.11.4.GIT