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

问题描述 投票:0回答:3

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

Lex 代码:

解析器.lex

Yacc代码:

解析器.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打印语法错误?
c parsing bison flex-lexer
3个回答
3
投票

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

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

这将为该标记设置

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

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

此外,你还有这样的模式:

'int' return INT;

'
字符对于弯曲来说并不特殊,因此此模式与 5 个字符序列
'int'
匹配。


1
投票
  if (yyparse())

应该是

  if (yyparse() == 0)

在你的 lex 规则中

"\n" {/*simply skip new line*/}
你可以跟踪行号,这样当出现语法错误时你可以打印出行号。


0
投票

你能给我完整的代码吗 我有一个问题 使用 bison 编写一个程序,根据算术表达式的给定语法创建一系列简单步骤(三地址代码)。例如,如果输入是-

a + b * c + d

程序应将输出打印为-

 T1 = b * c
  T2 = a + T1
  T3 = T2 + d
© www.soinside.com 2019 - 2024. All rights reserved.