diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2015-12-01 22:51:34 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2015-12-01 22:51:34 +0800 |
commit | 15d78a2151c63a45adfad9dc954f79eba9207dab (patch) | |
tree | afad02a7832bdabcec830fa50012fa30d3f03751 | |
parent | dfa381e23f94fe14d7fca77fb753d39e632f8616 (diff) | |
download | compiler2015-15d78a2151c63a45adfad9dc954f79eba9207dab.tar.gz compiler2015-15d78a2151c63a45adfad9dc954f79eba9207dab.tar.zst compiler2015-15d78a2151c63a45adfad9dc954f79eba9207dab.zip |
Make the scanner and the parser reentrant and reduce non-namespaced symbols
-rw-r--r-- | src/lexer.l | 20 | ||||
-rw-r--r-- | src/main.c | 31 | ||||
-rw-r--r-- | src/parser.y | 20 |
3 files changed, 52 insertions, 19 deletions
diff --git a/src/lexer.l b/src/lexer.l index ed0fc34..1c7d940 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -1,4 +1,6 @@ -%option noyywrap +%option noyywrap reentrant bison-bridge +%option outfile="lex.yy.c" +%option prefix="ccmmc_parser_" %{ #ifdef HAVE_CONFIG_H # include "config.h" @@ -14,6 +16,8 @@ #include <string.h> int line_number = 1; + +#define YYSTYPE CCMMC_PARSER_STYPE %} letter [A-Za-z] @@ -65,8 +69,8 @@ ERROR . size_t i; char *reserved[] = {"return", "typedef", "if", "else", "int", "float", "for", "void", "while"}; - enum yytokentype reserved_token[] = {RETURN, TYPEDEF, - IF, ELSE, INT, FLOAT, FOR, VOID, WHILE}; + enum ccmmc_parser_tokentype reserved_token[] = {RETURN, + TYPEDEF, IF, ELSE, INT, FLOAT, FOR, VOID, WHILE}; static_assert( SIZEOF_ARRAY(reserved) == SIZEOF_ARRAY(reserved_token), "Reserved words array and reserved tokens array " @@ -83,8 +87,8 @@ ERROR . else ptr->counter++; } - yylval.lexeme = strdup(yytext); - ERR_FATAL_CHECK(yylval.lexeme, strdup); + yylval->lexeme = strdup(yytext); + ERR_FATAL_CHECK(yylval->lexeme, strdup); return ID; } {CONST_INT} { @@ -93,7 +97,7 @@ ERROR . ERR_FATAL_CHECK(p, malloc); p->const_type = INTEGERC; p->const_u.intval = atoi(yytext); - yylval.const1 = p; + yylval->const1 = p; return CONST; } {CONST_FLOAT} { @@ -102,7 +106,7 @@ ERROR . ERR_FATAL_CHECK(p, malloc); p->const_type = FLOATC; p->const_u.fval = atof(yytext); - yylval.const1 = p; + yylval->const1 = p; return CONST; } {CONST_STRING} { @@ -112,7 +116,7 @@ ERROR . p->const_type = STRINGC; p->const_u.sc = strdup(yytext); ERR_FATAL_CHECK(p->const_u.sc, strdup); - yylval.const1 = p; + yylval->const1 = p; return CONST; } {COMMENT} { @@ -2,6 +2,8 @@ # include "config.h" #endif +typedef void* yyscan_t; + #include "ast.h" #include "common.h" #include "libparser_a-parser.h" @@ -16,6 +18,10 @@ extern FILE *yyin; extern AST_NODE *prog; +extern int ccmmc_parser_lex_init(yyscan_t *scanner); +extern int ccmmc_parser_lex_destroy(yyscan_t *scanner); +extern int ccmmc_parser_set_in(FILE *source_handle, yyscan_t scanner); + const char *ccmmc_main_name; int main (int argc, char **argv) @@ -30,14 +36,29 @@ int main (int argc, char **argv) exit(1); } - const char *filename = argv[1]; - yyin = fopen(filename, "r"); - if (yyin == NULL) { - fprintf(stderr, "%s: %s: %s\n", name, filename, ERR_MSG); + const char *source_name = argv[1]; + FILE *source_handle = fopen(source_name, "r"); + if (source_handle == NULL) { + fprintf(stderr, "%s: %s: %s\n", name, source_name, ERR_MSG); exit(1); } - yyparse(); + yyscan_t scanner; + ccmmc_parser_lex_init(&scanner); + ccmmc_parser_set_in(source_handle, scanner); + switch (ccmmc_parser_parse(scanner)) { + case 1: + fprintf(stderr, "%s: failed because of invalid input\n", name); + exit(1); + case 2: + fprintf(stderr, "%s: failed because of memory exhaustion\n", name); + exit(1); + default: + ; // silence warnings + } + ccmmc_parser_lex_destroy(scanner); + + fclose(source_handle); printGV(prog, NULL); return 0; } diff --git a/src/parser.y b/src/parser.y index a837259..d90aaa7 100644 --- a/src/parser.y +++ b/src/parser.y @@ -1,20 +1,22 @@ +%define api.prefix {ccmmc_parser_} +%define api.pure full +%lex-param {yyscan_t scanner} +%parse-param {yyscan_t scanner} %{ #ifdef HAVE_CONFIG_H # include "config.h" #endif +typedef void* yyscan_t; + #include "ast.h" #include <stdio.h> #include <stdlib.h> #include <string.h> -extern int yylex(void); -static void yyerror(const char *mesg); - AST_NODE *prog; -extern char *yytext; extern int line_number; extern int g_anyErrorOccur; %} @@ -25,6 +27,12 @@ extern int g_anyErrorOccur; AST_NODE *node; }; +%{ +extern char *ccmmc_parser_get_text(yyscan_t scanner); +extern int ccmmc_parser_lex(CCMMC_PARSER_STYPE *yylval, yyscan_t scanner); +static void ccmmc_parser_error(yyscan_t scanner, const char *mesg); +%} + %token <lexeme>ID %token <const1>CONST %token VOID @@ -686,10 +694,10 @@ dim_list : dim_list DL_LBRACK expr DL_RBRACK %% -static void yyerror(const char *mesg) +static void ccmmc_parser_error(yyscan_t scanner, const char *mesg) { fprintf(stderr, "Error found in Line \t%d\tnext token: \t%s\n", - line_number, yytext); + line_number, ccmmc_parser_get_text(scanner)); exit(1); } |