需要用lex和yacc生成三地址代码,求帮助。

3

我正在为一个类似C语言的程序生成三地址代码,其中包含声明、算术、布尔、if和while语句。 目前我正在处理算术表达式。我从文本文件中读取类似C语言的程序。

词法分析代码:

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会打印语法错误?

首先,如果yyparse()解析的输入有效,它会返回0,而你得到了一个1的返回值,所以"Successful parsing"的消息是错误的。"syntax error"的消息来自于yyerror(),这是预期的。至于其他问题,我无法评论,因为我还没有研究过语法。 - Charlie Burns
注意标记;flex-lexer 用于词法分析器;flex 用于 Adobe/Apache UI 框架。 - JeffryHouser
2个回答

3
在您的词法分析器代码中,您会发现以下内容:
{number} {yylval=yytext; return NUMBER;}

这将会设置$$指向词法分析器内部缓冲区,但该缓冲区会在下一次调用yylex时被覆盖,因此当你在解析器中打印它时,会输出一些垃圾信息。你需要像这样做:

{number} {yylval=strdup(yytext); return NUMBER;}

此外,您还有像这样的模式:
'int' return INT;
< p >在 Flex 中,< code >' 字符没有任何特殊含义,因此该模式匹配 5 个字符序列 < code >'int'。


1
  if (yyparse())

应该是


  if (yyparse() == 0)

在您的词法规则"\n" {/*简单跳过新行*/}中,您可以跟踪行号,以便在出现语法错误时打印出行号。

我已经处理了。但是为什么三地址代码没有被正确生成? - Madeyedexter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接