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

标签 c parsing bison flex-lexer

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

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

最佳答案

在你的词法分析器代码中,你有这样的东西:

{number} {yylval=yytext; return NUMBER;}

这将为该标记设置 $$ 以指向词法分析器内部缓冲区,该缓冲区将被下一次调用 yylex 破坏,因此当您在解析器中打印它时,您将打印一些垃圾。你需要这样的东西:

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

此外,您还有以下模式:

'int' return INT;

' 字符在任何方面都没有特殊的弯曲方式,因此该模式与 5 字符序列 'int' 相匹配。

关于c - 需要帮助使用 lex 和 yacc 生成三个地址代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19980295/

相关文章:

parsing - Lex/Flex 中的开始状态

bison - Yacc 的某些版本是否在规则和操作之间使用 '='?

c - 使用 Qt Creator(不使用任何类型的 Qt 框架)时的 C(非 C++)程序的 printf

arrays - 如何确定 C 中数组的大小?

创建一个循环来切换值并存储新值以供进一步计算

来自 EventBrite 的带时区的 Javascript 日期

c - 除非在特定条件下,否则如何消除显示的数字序列?

C:字符串和指针。以特定模式更改字符串中的子字符串

php - 复制一个单词并将其保存为一个变量

c++ - 将 flex 和 bison 编译成 cpp