%{ #include //int sym[26]; extern yylval; extern FILE *yyin, *yyout; //int yylex(void); void yyerror(char *); extern int lino; %} %token NUMBER FLOATNUM ID STR LOGOP %token INT CHAR SHORT LONG FLOAT UNSIGNED DOUBLE UNSIGNED VOID %token DELIM COMMA COLON EQUAL OPAR CPAR OBRACK CBRACK %token EQL GT LT GTE LTE AND OR NOT %token FOR WHILE DO IF SWITCH CASE ELSE %token ADD SUB MUL DIV %% program: dec_statements functions { printf("Success: \n");} ; dec_statements: dec_statements dec_statement | ; dec_statement: INT iid_list DELIM |SHORT INT iid_list DELIM |CHAR iid_list DELIM |SHORT INT iid_list DELIM |FLOAT iid_list DELIM |UNSIGNED INT iid_list DELIM |LONG DOUBLE iid_list DELIM |DOUBLE iid_list DELIM ; iid_list: iid_list COMMA iid_list2 |iid_list2 ; iid_list2: ID |ID EQUAL NUMBER |ID EQUAL FLOAT ; functions: functions function |function ; function: type ID OPAR param CPAR block ; type: INT |CHAR |SHORT INT |FLOAT |LONG |DOUBLE |UNSIGNED INT |UNSIGNED LONG |LONG DOUBLE |UNSIGNED CHAR |VOID ; param: param COMMA type ID |type ID | ; block: OBRACK statements CBRACK ; statements: statements statement | ; statement: dec_statement |assign_statement |functioncall |condition_statement |loop_statement |DELIM ; assign_statement: ID EQUAL expr |ID ADD EQUAL expr |ID SUB EQUAL expr |ID MUL EQUAL expr |ID DIV EQUAL expr ; expr: para | expr ADD expr | expr SUB expr | expr MUL expr | expr DIV expr | OPAR expr CPAR ; para: ID |num_type num_type: NUMBER |FLOATNUM ; functioncall: ID OPAR func_par_list CPAR DELIM ; func_par_list: func_par_list COMMA para |para | ; condition_statement: if_con |switch_con ; if_con: IF OPAR condition CPAR st_block |IF OPAR condition CPAR st_block ELSE st_block ; condition: condition AND condition |condition OR condition |NOT condition |para LT para |para GT para |para LTE para |para GTE para |para EQL para |OPAR condition CPAR ; st_block: OBRACK statements CBRACK |statement ; switch_con: SWITCH OPAR ID CPAR case_block ; case_block: case_block CASE para COLON statements | ; loop_statement: for_loop |while_loop |do_loop ; for_loop: FOR OPAR dec_statement condition statement CPAR st_block ; while_loop: WHILE OPAR condition CPAR st_block ; do_loop: DO st_block WHILE OPAR condition CPAR DELIM ; %% void yyerror(char *s) { int i; fprintf(stderr,"%s \t %d \n",s,lino); /* while( (c = fgetc(yyin)) != ';') { printf("%c\n",c); scanf("%c",&c); lseek(yyin,-3,SEEK_CUR); } fputs("*",yyin); while( fgetc(yyin) == ';' ); fputs("",yyin); */ while((i=yylex())!=DELIM) { if(i==0) exit(0); } // lseek(yyin,0,SEEK_SET); yyparse(); return; } int main(void) { yyin = fopen("inp.txt","rw"); yyout = fopen("op.txt","w"); yyparse(); return 0; } %{ #include //int sym[26]; extern yylval; extern FILE *yyin, *yyout; //int yylex(void); void yyerror(char *); extern int lino; %} %token NUMBER FLOATNUM ID STR LOGOP %token INT CHAR SHORT LONG FLOAT UNSIGNED DOUBLE UNSIGNED VOID %token DELIM COMMA COLON EQUAL OPAR CPAR OBRACK CBRACK %token EQL GT LT GTE LTE AND OR NOT %token FOR WHILE DO IF SWITCH CASE ELSE %token ADD SUB MUL DIV %% program: dec_statements functions { printf("Success: \n");} ; dec_statements: dec_statements dec_statement | ; dec_statement: INT iid_list DELIM |SHORT INT iid_list DELIM |CHAR iid_list DELIM |SHORT INT iid_list DELIM |FLOAT iid_list DELIM |UNSIGNED INT iid_list DELIM |LONG DOUBLE iid_list DELIM |DOUBLE iid_list DELIM ; iid_list: iid_list COMMA iid_list2 |iid_list2 ; iid_list2: ID |ID EQUAL NUMBER |ID EQUAL FLOAT ; functions: functions function |function ; function: type ID OPAR param CPAR block ; type: INT |CHAR |SHORT INT |FLOAT |LONG |DOUBLE |UNSIGNED INT |UNSIGNED LONG |LONG DOUBLE |UNSIGNED CHAR |VOID ; param: param COMMA type ID |type ID | ; block: OBRACK statements CBRACK ; statements: statements statement | ; statement: dec_statement |assign_statement |functioncall |condition_statement |loop_statement |DELIM ; assign_statement: ID EQUAL expr |ID ADD EQUAL expr |ID SUB EQUAL expr |ID MUL EQUAL expr |ID DIV EQUAL expr ; expr: para | expr ADD expr | expr SUB expr | expr MUL expr | expr DIV expr | OPAR expr CPAR ; para: ID |num_type num_type: NUMBER |FLOATNUM ; functioncall: ID OPAR func_par_list CPAR DELIM ; func_par_list: func_par_list COMMA para |para | ; condition_statement: if_con |switch_con ; if_con: IF OPAR condition CPAR st_block |IF OPAR condition CPAR st_block ELSE st_block ; condition: condition AND condition |condition OR condition |NOT condition |para LT para |para GT para |para LTE para |para GTE para |para EQL para |OPAR condition CPAR ; st_block: OBRACK statements CBRACK |statement ; switch_con: SWITCH OPAR ID CPAR case_block ; case_block: case_block CASE para COLON statements | ; loop_statement: for_loop |while_loop |do_loop ; for_loop: FOR OPAR dec_statement condition statement CPAR st_block ; while_loop: WHILE OPAR condition CPAR st_block ; do_loop: DO st_block WHILE OPAR condition CPAR DELIM ; %% void yyerror(char *s) { int i; fprintf(stderr,"%s \t %d \n",s,lino); /* while( (c = fgetc(yyin)) != ';') { printf("%c\n",c); scanf("%c",&c); lseek(yyin,-3,SEEK_CUR); } fputs("*",yyin); while( fgetc(yyin) == ';' ); fputs("",yyin); */ while((i=yylex())!=DELIM) { if(i==0) exit(0); } // lseek(yyin,0,SEEK_SET); yyparse(); return; } int main(void) { yyin = fopen("inp.txt","rw"); yyout = fopen("op.txt","w"); yyparse(); return 0; }