3

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

法典代码:

解析器

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

2 回答 2

3

在您的词法分析器代码中,您有以下内容:

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

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

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

此外,您还有以下模式:

'int' return INT;

'字符在任何方面都不是特殊的 flex,因此该模式与 5-character sequence 匹配'int'

于 2013-11-14T16:55:00.867 回答
1
  if (yyparse())

应该

  if (yyparse() == 0)

在您的 lex 规则"\n" {/*simply skip new line*/}中,您可以跟踪行号,因此当出现语法错误时,您可以打印出行号。

于 2013-11-14T14:53:53.210 回答