我的问题是我正在尝试运行我使用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
如果您需要更多信息或代码,请与我们联系!
答案 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:)。