1

我的问题是我试图运行一个我使用 flex-bison 扫描仪解析器编码的问题。我的程序应该做的是接受用户输入(在我的例子中,查询我正在设计的数据库系统)、lex 和解析,然后执行相应的操作。实际发生的是我的解析器代码没有正确解释我提供给它的字符串文字。

这是我的代码:

130 insertexpr :  "INSERT" expr '(' expr ')'
131 
132                  {
133                         $$ = new QLInsert( $2, $4 );
134                          }
135                         ;

我的输入,按照“查询:”提示:

查询:插入 abc(5);
输入:1.0-5:语法错误,意外字符串,预期文件结尾或行尾或 INSERT 或 ';'

现在,如果我从第 130 行的 parser.yy 代码中删除“INSERT”字符串文字,程序运行得很好。事实上,在存储输入数据(即“abc”和整数 5)后,它会正确返回给我。

起初,我认为这是字符编码的问题。Bison 代码需要使用相同的编码进行编译和运行,这应该不是问题,因为我正在从同一个终端编译和运行。

我的系统详情:

Ubuntu 8.10 (Linux 2.6.24-16-generic)
flex 2.5.34
bison 2.3
gcc 4.2.4

如果您需要更多信息或代码,请告诉我!

4

2 回答 2

4

这是一个典型的错误,如果您使用 flex 将您的输入 lex 转换为标记,则不能将解析器中的文字字符串称为文字字符串,而应为它们使用标记。

有关详细信息,请参阅此类似问题

于 2009-03-30T21:19:38.993 回答
0

谢谢,谢谢,谢谢!

澄清一下,这是我根据 jpalecek 的评论实现我的解决方案的方式。首先,我在野牛代码 (parser.yy) 中声明了一个 INSERT 令牌:

71 %token INSERT

接下来,我在弹性代码 (scanner.ll) 中定义了该标记:

79 "INSERT INTO" { return token::INSERT; }

最后,我在语法规则中使用了标记 INSERT:

132 insertexpr :  INSERT expr '(' expr ')'
133 
134                  {
135                         $$ = new QLInsert( $2, $4 );
136                          }
137                         ;

瞧!我的过度头痛终于结束了!

谢谢,jpalecek :)。

于 2009-03-30T22:05:49.133 回答