rlm@1: %{ rlm@1: namespace std { rlm@1: #include rlm@1: #include rlm@1: #include rlm@1: #include rlm@1: } rlm@1: rlm@1: using namespace std; rlm@1: rlm@1: #include "System.h" rlm@1: #include "elf.h" rlm@1: #include "exprNode.h" rlm@1: rlm@1: extern int yyerror(char *); rlm@1: extern int yylex(); rlm@1: extern char *yytext; rlm@1: rlm@1: rlm@1: //#define YYERROR_VERBOSE 1 rlm@1: //#define YYDEBUG 1 rlm@1: rlm@1: Node *result = NULL; rlm@1: %} rlm@1: rlm@1: %token TOKEN_IDENTIFIER TOKEN_DOT TOKEN_STAR TOKEN_ARROW TOKEN_ADDR rlm@1: %token TOKEN_SIZEOF TOKEN_NUMBER rlm@1: %left TOKEN_DOT TOKEN_ARROW '[' rlm@1: %expect 6 rlm@1: %% rlm@1: rlm@1: final: expression { result = $1; } rlm@1: ; rlm@1: rlm@1: expression: rlm@1: simple_expression { $$ = $1; } | rlm@1: '(' expression ')' { $$ = $2; } | rlm@1: expression TOKEN_DOT ident { $$ = exprNodeDot($1, $3); } | rlm@1: expression TOKEN_ARROW ident { $$ = exprNodeArrow($1, $3); } | rlm@1: expression '[' number ']' { $$ = exprNodeArray($1, $3); } rlm@1: ; rlm@1: simple_expression: rlm@1: ident { $$ = $1; } | rlm@1: TOKEN_STAR expression { $$ = exprNodeStar($2); } | rlm@1: TOKEN_ADDR expression { $$ = exprNodeAddr($2); } | rlm@1: TOKEN_SIZEOF '(' expression ')' { $$ = exprNodeSizeof($3); } rlm@1: ; rlm@1: rlm@1: number: rlm@1: TOKEN_NUMBER { $$ = exprNodeNumber(); } rlm@1: ; rlm@1: rlm@1: ident: rlm@1: TOKEN_IDENTIFIER {$$ = exprNodeIdentifier(); } rlm@1: ; rlm@1: rlm@1: %% rlm@1: rlm@1: int yyerror(char *s) rlm@1: { rlm@1: return 0; rlm@1: } rlm@1: rlm@1: #ifndef SDL rlm@1: extern FILE *yyin; rlm@1: int main(int argc, char **argv) rlm@1: { rlm@1: // yydebug = 1; rlm@1: ++argv, --argc; rlm@1: if(argc > 0) rlm@1: yyin = fopen(argv[0], "r"); rlm@1: else rlm@1: yyin = stdin; rlm@1: if(!yyparse()) rlm@1: result->print(); rlm@1: } rlm@1: #endif