%{ #define YYDEBUG 1 #include #include #include #include #include "expr.h" /* YYSTYPE is the lexical value returned by each rule in a bison grammar. By default, it is an integer. In this example, we are returning a pointer to an expression. */ #define YYSTYPE struct stmt * /* Clunky: Manually declare the interface to the scanner generated by flex. */ extern char *yytext; extern int yylex(); // void yyerror(struct stmt *parser_result, const char*); void yyerror(const char*); extern int yylineno; struct stmt *parser_result = 0; %} // %parse-param {struct stmt *parser_result} %debug %define parse.error detailed %token TOKEN_EOF %token TOKEN_KEYWORD_IDENTIFICATION %token TOKEN_KEYWORD_DIVISION %token TOKEN_KEYWORD_DATA %token TOKEN_KEYWORD_SECTION %token TOKEN_PROGRAM_ID %token TOKEN_WORKING_STORAGE %token TOKEN_PROCEDURE %token TOKEN_STOP %token TOKEN_RUN %token TOKEN_MOVE %token TOKEN_KEYWORD_TO %token TOKEN_PERFORM %token TOKEN_VARYING %token TOKEN_KEYWORD_FROM %token TOKEN_KEYWORD_BY %token TOKEN_UNTIL %token TOKEN_END_PERFORM %token TOKEN_IF %token TOKEN_ELSE_IF %token TOKEN_ELSE %token TOKEN_END_IF %token TOKEN_SPACE %token TOKEN_KEYWORD_OCCURS %token TOKEN_KEYWORD_VALUE %token TOKEN_KEYWORD_COMPUTE %token TOKEN_KEYWORD_FUNCTION %token TOKEN_IDENT %token TOKEN_STRING %token TOKEN_INTEGER %token TOKEN_PICTURE %token TOKEN_ALPHANUMERIC %token TOKEN_NUMERIC %token TOKEN_SIGNED_NUMERIC %token TOKEN_IMPLIED_DECIMAL %token TOKEN_COMPUTATION_LEVEL_0 %token TOKEN_COMPUTATION_LEVEL_1 %token TOKEN_COMPUTATION_LEVEL_2 %token TOKEN_COMPUTATION_LEVEL_3 %token TOKEN_LEFT_PARENTHESIS %token TOKEN_RIGHT_PARENTHESIS %token TOKEN_DOT %token TOKEN_ADD %token TOKEN_SUB %token TOKEN_MULTIPLY %token TOKEN_DIVIDE %token TOKEN_EQUAL %token TOKEN_GREATER_THAN %token TOKEN_LESS_THAN %token TOKEN_EXPONENTIAL %token TOKEN_DISPLAY %% file : statements {parser_result = $1; return 0;} ; statements : statements statement { $$ = $1; $1->next = $2; } | statement { $$ = $1; } ; statement : simple_stmt {$$ = stmt_create(STMT_BLOCK, NULL, NULL, NULL, NULL, $1, NULL, NULL);} ; simple_stmt : cbl_func_stmt {$$ = $1;} ; cbl_func_stmt : display_stmt {$$ = $1;} ; display_stmt : TOKEN_DISPLAY expr {$$ = stmt_create(STMT_PRINT, NULL, NULL, $2, NULL, NULL, NULL, NULL);} ; expr : TOKEN_STRING { $$ = expr_create_string_literal(yytext);} ; %% void yyerror(const char* msg) { fprintf(stderr, "Error | Line: %d\n%s\n",yylineno,msg); }