summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2015-12-01 22:51:34 +0800
committerTing-Wei Lan <lantw44@gmail.com>2015-12-01 22:51:34 +0800
commit15d78a2151c63a45adfad9dc954f79eba9207dab (patch)
treeafad02a7832bdabcec830fa50012fa30d3f03751
parentdfa381e23f94fe14d7fca77fb753d39e632f8616 (diff)
downloadcompiler2015-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.l20
-rw-r--r--src/main.c31
-rw-r--r--src/parser.y20
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} {
diff --git a/src/main.c b/src/main.c
index 2370f5a..cc52b13 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
}