2017-11-18 83 views
1

使用ANTLR 3,我的词法有规则词法规则可选后缀不匹配,当它应该使用这种这些匹配正确</p> <pre><code>SELECT VAR1 ASSIGN TO SELECT VAR1 ASSIGN USING </code></pre> <p>匹配

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

,这也符合

SELECT VAR1 ASSIGN FOO 

但是这不符合

SELECT VAR1 ASSIGN TWO 

鉴于我在标准中将TO | USING标记为可选项。

从生成的Java代码,我看到了 当词法分析器注意到的两个T,它会匹配(“至”) 但由于没有找到ØT后 然后生成失败....返回所有从规则的方式 - 因此不匹配。

如何让我的词法规则来匹配,当输入了单词以字符开始与规则

基本上,我想我的规则是为了匹配这个(什么它已经匹配旁边的后缀可选部分 - 如lised在开始):

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' 

但它是可以做到所期望的一个词法规则?

+0

请提供一个简单但完整的词法分析器语法来完成此操作(a [mcve]) - 问题可能出现在另一个词法分析器规则中。 –

回答

0

的方法来获得这一个规则,通过我的高级建议 - 使用语法谓词

SELECT_ASSIGN 
: tok='SELECT' WS+ name=IDENTIFIER WS+ 'ASSIGN' 
    (
     (WS+ ('TO'|'USING') WS+)=> (WS+ ('TO'|'USING') WS+) 
     | (WS+) 
    ) 
0

令牌匹配一个完整的字符序列或无。它无法部分匹配,语法规则决定了它的确切位置。你不能指望TO的规则匹配TWO。如果您想要TWO也匹配,则必须将其添加到词法分析器规则中。

这里的几个注意事项:

  1. 该解决方案的“前辈”给你毫无意义可言。 A 句法谓词在万案的情况下是指导解析器的有点前瞻性。这里没有涉及到的任何形式。
  2. 书写 作为词法分析规则的整个SELECT_ASSIGN规则是非常罕见的,并且不灵活。词法分析器规则不应该用于整个句子,而是仅用于一小组字符以找到用于分配它们的标记 一种类型(通常是诸如string,,,comment等等的语言的基本结构)。
  3. ANTLR3已经完全过时了,我想知道为什么你的班级仍然使用它。 ANTLR4已有5年的历史,应该是任何新项目的选择。
+0

我不希望“TO的规则”与TWO匹配。 我说的是这样的: 我期望词法分析器规则至少匹配输入“SELECT VAR1 ASSIGN TWO”的前3个单词 - 因为在规则的末尾使用TO | USING是可选的。 – vikramsjn

+0

不过,我的答案适用。词法分析规则完全匹配或根本不匹配。如果您已将SELECT_ASSIGN规则编写为解析器规则,则情况会发生变化。对于解析器规则,原理也适用于它完全匹配或根本不匹配,但是当您将规则分成若干部分时,生成的分析树将至少包含那些匹配的部分(取决于规则的结构)。 –

相关问题