下面的词法分析器语法片段应该根据类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:c
,some:cn
,some:cna
,some:cnam
直到最后{ {1}}。
有没有一种方法可以更改行为,以强制antlr4在调用谓词之前首先找到最长的匹配项?另外,在这种情况下,谓词是否有一种有效的方法来确定匹配不是最长只用some:cname
返回的最长匹配?
编辑:关于此行为的有趣的事情是,只要只有部分匹配项传递给谓词,则词法分析器似乎完全会忽略谓词的结果。这似乎效率很低。
答案 0 :(得分:0)
事实证明,该行为是Antlr已知并允许的。 Antlr可能会调用谓词,也可能不会调用谓词(see here for more details)。为了避免这种行为,我现在改用动作,只有在规则完全成功地匹配后,动作才会执行。这使我能够在动作中切换模式。