当前位置: 首页 > 知识库问答 >
问题:

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

南宫保臣
2023-03-14

下面的lexer语法片段应该根据类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的正确匹配总是尽可能长的匹配。现在,如果lexer遇到一个自定义名称,比如some:cname,那么我希望它对整个字符串some:cname,然后用'some:cname'作为参数调用一次谓词。

编辑:这种行为的有趣之处在于,只要将部分匹配传递给谓词,谓词的结果似乎完全被lexer忽略了。这似乎效率很低。

共有1个答案

严扬
2023-03-14

事实证明,ANTLR已知并允许该行为。Antlr可以调用谓词,也可以不调用谓词(更多细节请参见此处)。为了避免这种行为,我现在使用操作来代替,这些操作只有在规则完全成功匹配后才会执行。这允许我在动作中切换模式。

 类似资料:
  • 量词,看上去十分简单,但实际上它可能会很棘手。 如果我们打算寻找比 /\d+/ 更加复杂的东西,就需要理解搜索工作是如何进行的。 以接下来的问题为例。 有一个文本,我们需要用书名号:«...» 来代替所有的引号 "..."。在许多国家,它们是排版的首选。 例如:"Hello, world" 将会变成 «Hello, world»。 一些国家偏爱 „Witam, świat!”(波兰语)甚至 「你好

  • 关于antlr4的几个问题使用了书中没有提到的lexer谓词,例如28730446使用了head(String),42058127使用了getCharPositionInLine(),23465358使用了_input.la(1)等。是否有可用的lexer谓词列表及其文档?

  • 我在应用程序中使用Querydsl来大大改进查询数据库的代码。但是,我有一个来自外部服务的JPA谓词(javax.persistence.criteria.Predicate)。我想混合使用Querydsl和外部谓词创建的查询。例如: 另一个解决方案是将Querydsl谓词转换为JPA谓词: 有可能吗?如果是,我如何做到这一点?如果没有,是否有其他混合谓词的解决方案(比如将两者转换为SQL字符串并

  • 谓词是指用方括号写的XPath表达式。 它指的是为某些条件限制节点集中的选定节点。 例如, 序号 序号 描述 1 选择第一个元素,它是元素的子元素。 2 选择最后一个元素,它是元素的子元素。 3 使用选择元素。 4 选择大于的元素。 示例 此示例通过迭代每个学生创建一个包含其详细信息的元素。 它计算节点的位置,然后打印学生的详细信息以及序列号。 文件:students.xml - 文件:stude

  • 谓词 Clojure 提供了很多函数来充当谓词的功能 — 测试条件是否成立。它们的返回值是 true或者false。在Clojure里面 false 以及 nil 被解释成false. true 以及任何其他值都被解释成true, 包括0。谓词函数的名字一般以问号结尾。 反射是一种获取一个对象的特性,而不是它的值的过程。比如说对象的类型。有很多谓词函数进行反射。 测试一个对象的类型的谓词包括 cl