带有贪婪*量词的ANTLR4谓词:避免不必要的谓词调用(词法分析)

时间:2019-06-19 08:19:51

标签: antlr antlr4

下面的词法分析器语法片段应该根据类LexerHelper中定义的谓词来标记化“自定义名称”:

fragment NUMERICAL      : [0-9];

fragment XML_NameStartChar
                        : [:a-zA-Z]
                        | '\u2070'..'\u218F'
                        | '\u2C00'..'\u2FEF'
                        | '\u3001'..'\uD7FF'
                        | '\uF900'..'\uFDCF'
                        | '\uFDF0'..'\uFFFD'
                        ;

fragment XML_NameChar   : XML_NameStartChar
                        | '-' | '_' | '.' | NUMERICAL
                        | '\u00B7'
                        | '\u0300'..'\u036F'
                        | '\u203F'..'\u2040'
                        ;

fragment XML_NAME_FRAG  : XML_NameStartChar XML_NameChar*;

CUSTOM_NAME             : XML_NAME_FRAG ':' XML_NAME_FRAG {LexerHelper.myPredicate(getText())}?;

CUSTOM_NAME的正确匹配始终是可能的最长匹配。现在,如果词法分析器遇到诸如some:cname之类的自定义名称,那么我希望它对整个字符串some:cname进行词法分析,然后以'some:cname'作为参数调用谓词一次。

相反,词法分析器会调用谓词及其在过程中找到的每个可能的“有效”匹配项,因此some:csome:cnsome:cnasome:cnam直到最后{ {1}}。

有没有一种方法可以更改行为,以强制antlr4在调用谓词之前首先找到最长的匹配项?另外,在这种情况下,谓词是否有一种有效的方法来确定匹配不是最长只用some:cname返回的最长匹配?

编辑:关于此行为的有趣的事情是,只要只有部分匹配项传递给谓词,则词法分析器似乎完全会忽略谓词的结果。这似乎效率很低。

1 个答案:

答案 0 :(得分:0)

事实证明,该行为是Antlr已知并允许的。 Antlr可能会调用谓词,也可能不会调用谓词(see here for more details)。为了避免这种行为,我现在改用动作,只有在规则完全成功地匹配后,动作才会执行。这使我能够在动作中切换模式。