Bison似乎没有恰当地识别C字符串文字

时间:2009-03-30 21:14:00

标签: c++ parsing bison flex-lexer lexical-analysis

我的问题是我正在尝试运行我使用flex-bison扫描程序解析器编码的问题。我的程序应该做的是获取用户输入(在我的情况下,查询我正在设计的数据库系统),lex和parse,然后执行相应的操作。实际发生的是我的解析器代码没有正确解释我提供它的字符串文字。

这是我的代码:

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

我的输入,在“查询:”提示后:

  

查询:INSERT 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
野牛2.3
gcc 4.2.4

如果您需要更多信息或代码,请与我们联系!

2 个答案:

答案 0 :(得分:3)

这是一个经典错误,如果你使用flex来输入你的输入到标记,你不能将解析器中的文字字符串称为文字字符串,而是使用它们的标记。

有关详细信息,请参阅this similar question

答案 1 :(得分:0)

Thankee,thankee,thankee!

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

71 %token INSERT

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

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

最后,我在语法规则中使用了令牌INSERT:

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

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

谢谢,jpalecek:)。