Lexer规则可选后缀不匹配,何时应该匹配

时间:2017-11-18 02:52:19

标签: parsing antlr3 lexer

使用ANTLR 3,我的词法分析器有规则

SELECT_ASSIGN:    
'SELECT' WS+ IDENTIFIER WS+ 'ASSIGN' WS+  (('TO'|'USING') WS+)?

正确使用这些匹配

SELECT VAR1 ASSIGN TO
SELECT VAR1 ASSIGN USING

这也匹配

SELECT VAR1 ASSIGN FOO

但是这与

不匹配
SELECT VAR1 ASSIGN TWO

我在规则中将TO | USING标记为可选。

从生成的Java代码中我看到...... 当词法分析器注意到TW为T时,它会匹配('TO') 但是因为在T之后没有找到O. 然后生成失败....并从规则中一直返回 - 因此不匹配它。

如果输入的字符以字符的后缀可选部分开头的字符

,我如何让我的词法分析器规则匹配?

基本上我希望我的规则也能与之相匹配(除了它已经匹配的东西 - 就像开头一样):

SELECT VAR1 ASSIGN TWO

请建议我如何处理/解决这种情况。

注:

在解析器中建议使用这样的规则 - 但我在词法分析器中有这个 - 因为我不想解析器解析整个输入,并且只想解析感兴趣的内容。所以在词法分析器中使用这样的规则,我找到了解析器真正要解析的部分。

更新1 我可以通过制定2条规则来解决这个问题:

SELECT_ASSIGN_USING_TO
: tok='SELECT' WS+ name=IDENTIFIER WS+ 'ASSIGN' WS+ ('USING'|'TO')

SELECT_ASSIGN
: tok='SELECT' WS+ name=IDENTIFIER WS+ 'ASSIGN'

但是有可能在一个词法分析器规则中执行所需的操作吗?

2 个答案:

答案 0 :(得分:0)

我的大四学生建议在一条规则中得到这个的方法 - 使用句法谓词

NODE_PATH=. react-scripts start

答案 1 :(得分:0)

标记匹配完整的char序列或没有。它无法部分匹配,语法规则确切地确定了哪一个。您不能指望TO的规则与TWO匹配。如果您希望TWO匹配,则必须将其添加到词法分析器规则中。

这里有几点说明:

  1. 解决方案您的老人"让你毫无意义。一个 语法谓词是指导解析器以防万一的先行者 野蛮人这里没有任何不安全因素。
  2. 书写 作为词法分析器规则的整个SELECT_ASSIGN规则非常罕见 不灵活。词法规则不应该用于整个句子, 但只有一小部分字符才能找到分配它们的标记 一种类型(通常是string等语言的基本结构, numbercomment等。)。
  3. ANTLR3完全过时了,我想知道为什么这仍然在你的课堂上使用。 ANTLR4已经推出5年了,应该是任何新项目的选择。
相关问题