Untitled
unknown
c_cpp
2 years ago
3.9 kB
4
Indexable
%{ #include <stdio.h> #include <stdlib.h> #include "cgen.h" #include <string.h> extern int yylex(void); extern int lineNum; %} %union { char* str; int int_num; double float_num; } /** KEYWORDS **/ %token <str> KW_INTEGER; %token <str> KW_FOR; %token <str> KW_BREAK; %token <str> KW_DEF; %token <str> KW_ENDCOMP; %token <str> KW_SCALAR; %token <str> KW_CONST; %token <str> KW_IN; %token <str> KW_CONTINUE; %token <str> KW_NOT; %token <str> KW_ENDDEF; %token <str> KW_OF; %token <str> KW_MAIN; %token <str> KW_STRING; %token <str> KW_BOOLEAN; %token <str> KW_FALSE; %token <str> KW_TRUE; %token <str> KW_IF; %token <str> KW_ELSE; %token <str> KW_ENDIF; %token <str> KW_ENDFOR; %token <str> KW_WHILE; %token <str> KW_ENDWHILE; %token <str> KW_AND; %token <str> KW_OR; %token <str> KW_RETURN; %token <str> KW_COMP; /** DELIMETERS **/ %token <str> DEL_LEFTBLOCK %token <str> DEL_RIGHTBLOCK %token <str> DEL_ASSIGN %token <str> DEL_SEMICOLON %token <str> DEL_COMMA %token <str> DEL_RIGHTPAR %token <str> DEL_LEFTPAR %token <str> DEL_DOUBLEDOT %token <str> DEL_DOT /** OPERATORS **/ %token <str> OP_PLUS ; %token <str> OP_MINUS; %token <str> OP_MULT ; %token <str> OP_BACKSLASH %token <str> OP_MODULO %token <str> OP_POWER %token <str> OP_EQUAL %token <str> OP_UNEQUAL %token <str> OP_SMALLER %token <str> OP_SMALLEREQUAL %token <str> OP_BIGGER %token <str> OP_BIGGEREQUAL %token <str> OP_ASSIGN %token <str> OP_ASSIGNPLUS %token <str> OP_ASSIGNMINUS; %token <str> OP_ASSIGNMULT; %token <str> OP_ASSIGNBACKSLASH; %token <str> OP_ASSIGNMODULO; /* Other tokens */ %token <str> STRING %token <str> IDENTIFIER %token <int_num> INTEGER %token <float_num> FLOAT %left DEL_DOT DEL_LEFTPAR DEL_RIGHTPAR DEL_LEFTBLOCK DEL_RIGHTBLOCK %right OP_POWER %left OP_MULT OP_BACKSLASH OP_MODULO %left OP_PLUS OP_MINUS %left OP_SMALLER OP_SMALLEREQUAL OP_BIGGER OP_BIGGEREQUAL %left OP_EQUAL OP_UNEQUAL %right KW_NOT %left KW_AND %left KW_OR %right OP_ASSIGN OP_ASSIGNPLUS OP_ASSIGNMINUS OP_ASSIGNMULT OP_ASSIGNBACKSLASH OP_ASSIGNMODULO %start compiler %type <str> declaration_list %type <str> data_type_declaration %type <str> const_decl %type <str> constant_declaration %type <str> num_integer %type <str> num_float %% /*=========================GRAMMAR RULES==========================*/ compiler: declaration_list { if (yyerror_count == 0) { printf("\n\n"); puts(c_prologue); printf("/* program*/ \n\n"); printf("%s\n\n", $1); } } ; declaration_list: constant_declaration {$$=template("\n\n %s*/", $1);} data_type_declaration: KW_INTEGER {$$ = "int";} |KW_STRING {$$ = "char*";} |KW_SCALAR {$$ = "double";} |KW_BOOLEAN {$$ = "int";} |IDENTIFIER {$$ = $1;}; num_integer: INTEGER {$$ = template("%d", $1);} | OP_PLUS INTEGER {$$ = template("+%d", $2);} | OP_MINUS INTEGER {$$ = template("-%d", $2);}; num_float: FLOAT {$$ = template("%f", $1);} | OP_PLUS FLOAT {$$ = template("+%f", $2);} | OP_MINUS FLOAT {$$ = template("-%f", $2);}; /*-----------------------------------------------------------------------------------------*/ constant_declaration: %empty{$$=" ";} |const_decl {$$ = $1;}; const_decl: KW_CONST IDENTIFIER OP_ASSIGN num_integer DEL_DOUBLEDOT data_type_declaration DEL_SEMICOLON {$$ = template("const %s %s = %d;", $6, $2, $4);} |KW_CONST IDENTIFIER OP_ASSIGN num_float DEL_DOUBLEDOT data_type_declaration DEL_SEMICOLON {$$ = template("const %s %s = %f;", $6, $2, $4);} |KW_CONST IDENTIFIER OP_ASSIGN STRING DEL_DOUBLEDOT data_type_declaration DEL_SEMICOLON {$$ = template("const %s %s = %s;", $6, $2, $4);} ; /*-----------------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------------*/ %% /* Epilogue */ int main () { if ( yyparse() != 0 ) printf("\nRejected!\n"); }
Editor is loading...