将TOKEN与javacc tokenmanager中最短的char序列匹配?

时间:2015-08-11 22:58:33

标签: compiler-construction token javacc

根据tokenmanager doc,它尝试将当前看到的char序列与最长的令牌进行匹配。我似乎遇到了一些我不需要的情况:

例如在某些sql风格中,

" .show table"是一个声明

所以我将一个令牌定义为" .show"

但是在一些普通的sql中,我有#34;从t1&#34中选择t1.show_field;

这里没有给我令牌" t1","。"和#34; show_field",令牌管理器给了我" t1" " .show" ,而剩下的仍然在堆栈上。这导致了一个错误。

我怎样才能告诉javacc解析"。"在这种情况下?到目前为止,我把语法分开来识别"。" "显示"而不是整个" .show"。它有效,但有点片状。

由于 阳

1 个答案:

答案 0 :(得分:0)

当你剩下的字符是" .show ..."时,你不希望这样,下一个标记总是是"。& #34 ;.如果你做了那么令牌" .show"永远不会匹配。

同样,您不希望有一条规则,当剩下的字符为" .show ..."时,下一个标记应始终为&#34 ; .show&#34 ;.你的例子说明了这一点。

所以你需要弄清楚在什么情况下"。"是正确的,在什么情况下" .show"是正确的。最好的情况是你可以依赖于词法状态。

例如,假设你想要" .show"如果它发生在命令的最开始,但是"。"如果" .show"发生在其他地方。那你需要两个词汇状态。一个用于命令的第一个标记,另一个用于命令的其余部分。

有关词汇状态的更多信息,请参阅文档和常见问题解答。特别要阅读FAQ的部分内容,说明你应该避免尝试从解析器控制词法状态。