首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有贪婪*量词的ANTLR4谓词:避免不必要的谓词调用(词法分析)

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

Stack Overflow用户
提问于 2019-06-19 16:19:52
回答 1查看 73关注 0票数 0

按照词法分析器语法,片断应该根据在类LexerHelper中定义的谓词来标记化‘自定义名称’

代码语言:javascript
复制
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的正确匹配项总是尽可能长的匹配项。现在,如果lexer遇到一个自定义名称,比如some:cname,那么我希望它对整个字符串some:cname进行lex,然后使用‘some:cname:cname’作为参数调用谓词一次。

取而代之的是,词法分析器使用它在整个过程中找到的每个可能的“有效”匹配来调用谓词,因此some:csome:cnsome:cnasome:cnam直到最终为some:cname

有没有办法改变行为,强制antlr4在调用谓词之前先找到可能最长的匹配项?或者,有没有一种有效的方法让谓词确定匹配不是最长的匹配,在这种情况下只返回false

编辑:这种行为的有趣之处在于,只要只将部分匹配传递给谓词,那么词法分析器似乎完全忽略了谓词的结果。奇怪的是,这似乎是低效的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-19 22:43:24

事实证明,Antlr知道并允许这种行为。Antlr可能会调用谓词,也可能不会调用超出必要的谓词(see here for more details)。为了避免这种行为,我现在改为使用操作,只有在规则完全成功匹配时才会执行操作。这允许我在一个动作中切换模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56663106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档