我为包含声明,算术,布尔值,if和while语句的类似程序生成三个地址代码。 目前我开始使用算术表达式。我正在从文本文件中读取类似程序。
Lex代码:
Yacc代码:
输入C类似程序(test.txt的内容)
a=1+2/3;
我有一个make文件,如:
bison -d -v parser.y
flex -o parser.lex.c parser.lex
gcc -o cparser parser.lex.c parser.tab.c -lfl -lm
./cparser
当我编译输入文件时,我得到以下输出:
t1=2/3/3
t2=1+2/3;+t1
a=1+2/3;=t2
Parsing Successful. The three address code is:
syntax error
Successful parsing.
答案 0 :(得分:3)
在词法分析器代码中,您可以使用以下内容:
{number} {yylval=yytext; return NUMBER;}
这将为该标记设置$$
以指向词法分析器内部缓冲区,该缓冲区将被下一次调用yylex破坏,因此当您在解析器中打印它时,您将打印一些垃圾。你需要这样的东西:
{number} {yylval=strdup(yytext); return NUMBER;}
此外,您还有以下模式:
'int' return INT;
'
字符在任何方面都不是特殊的,因此该模式与5个字符的序列'int'
相匹配。
答案 1 :(得分:1)
if (yyparse())
应该是
if (yyparse() == 0)
在您的法律规则"\n" {/*simply skip new line*/}
中,您可以跟踪行号,以便在出现语法错误时打印出行号。