需要帮助使用lex和yacc生成三个地址代码

时间:2013-11-14 14:30:45

标签: c parsing bison flex-lexer

我为包含声明,算术,布尔值,if和while语句的类似程序生成三个地址代码。 目前我开始使用算术表达式。我正在从文本文件中读取类似程序。

Lex代码:

parser.lex

Yacc代码:

parser.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.
  • 为什么$ 1 $ 2 $ 3 ...等不包含所需的减价?
  • 为什么stderr打印语法错误?

2 个答案:

答案 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*/}中,您可以跟踪行号,以便在出现语法错误时打印出行号。