%{ /**************************************************************************** parser.y ParserWizard generated YACC file. Date: 07 December 2000 ****************************************************************************/ #include "lexer.h" #include "codegen.h" %} ///////////////////////////////////////////////////////////////////////////// // declarations section // parser name %name myparser // class definition { // place any extra class members here } // constructor { // place any extra initialisation code here } //// attribute type //%include { //#ifndef YYSTYPE //#define YYSTYPE int //#endif //} %union { int variableIdx; signed short value; class CTreeNode *treenode; } // place any declarations here %token STOP %token IF %token ELSE %token PAUSE %token PRINT %token ASSIGN %token EQUAL %token NOTEQUAL %token PLUS %token END_STMT %token OPEN_PAR %token CLOSE_PAR %token BEGIN_CS %token END_CS %token VARIABLE %token VALUE %type program statement_list statement %type assign_expression %type expression equal_expression notequal_expression %type variable %type value %% ///////////////////////////////////////////////////////////////////////////// // rules section // place your YACC rules here (there must be at least one) program :statement_list {s_baseTreeNode=$1;} ; statement_list :statement_list statement {$$=new CTreeNode(STMT_LIST,$1,$2);} | {$$=new CTreeNode(EMPTY_STMT);} ; statement :END_STMT {$$=new CTreeNode(EMPTY_STMT);} |STOP END_STMT {$$=new CTreeNode(STOP_STMT);} |PAUSE END_STMT {$$=new CTreeNode(PAUSE_STMT);} |PRINT OPEN_PAR value CLOSE_PAR END_STMT {$$=new CTreeNode(PRINT_STMT,$3);} |assign_expression END_STMT {$$=$1;} |IF OPEN_PAR expression CLOSE_PAR statement {$$=new CTreeNode(IF_STMT,$3,$5);} |IF OPEN_PAR expression CLOSE_PAR statement ELSE statement {$$=new CTreeNode(IFELSE_STMT,$3,$5,$7);} |BEGIN_CS statement_list END_CS {$$=new CTreeNode(STMT_LIST,$2);} ; assign_expression :variable ASSIGN value {$$=new CTreeNode(ASSIGN_EXPR,$1,$3);} ; expression :OPEN_PAR expression CLOSE_PAR {$$=$2;} |equal_expression {$$=$1;} |notequal_expression {$$=$1;} ; equal_expression :value EQUAL value {$$=new CTreeNode(EQUAL_EXPR,$1,$3);} ; notequal_expression :value NOTEQUAL value {$$=new CTreeNode(NOTEQUAL_EXPR,$1,$3);} ; variable :VARIABLE {$$=new CTreeNode(VARIABLE_EXPR,$1);} // variable id ; value :VALUE {$$=new CTreeNode(VALUE_EXPR,$1);} |VARIABLE {$$=new CTreeNode(VARIABLE_EXPR,$1);} // variable value |value PLUS value {$$=new CTreeNode(PLUS_EXPR,$1,$3);} ; %% ///////////////////////////////////////////////////////////////////////////// // programs section int main(void) { int n=1; openOutputFile("test.dat"); mylexer lexer; myparser parser; if(parser.yycreate(&lexer)) { if(lexer.yycreate(&parser)) { n=parser.yyparse(); } } if(s_baseTreeNode) { s_baseTreeNode->generateCode(true); } closeOutputFile(); return n; }