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

在Antlr 3(或4)中,如何使lexer基于谓词回溯?

谭向晨
2023-03-14

我在ANTLR3中有以下(简化)问题。我有一套特殊字符串和常规字符串语法的lexer规则。两者都是单引号。特殊字符串符合一种模式(例如,假设它们只包含字母)。还有一个函数可以确定匹配的字符串是否特殊。空白被忽略。

现在假设isSpecial只对字符串“foo”返回true。如果我看的是“'foo''bar''123'”,那么lexer应该为foo生成一个特殊的字符串标记,然后生成两个常规字符串标记。

SpecialLiteral : { isSpecial(getText()) }?=> '\'' (Letter)+ '\'' ;
StringLiteral : '\'' ( ~('\') )* '\'' ;

有可能解决这个问题吗?如果我只是手动编辑lexer,它似乎应该是可行的。我们知道mSpecialLiteral之前的位置,所以我们可以回到那里,然后像选通谓词之后那样操作。如何使用语法/要传递给isspecial的是什么?

共有1个答案

吴靖
2023-03-14

您可以在同一规则中匹配两者,然后在文本匹配后检查它是哪种类型,并在isspecial(getText())为true时将类型更改为specialliteral:

grammar T;

...

tokens {
  SpecialLiteral;
}

...

StringLiteral
 : '\'' ( ~( '\'' ) )* '\''
   {
     if(isSpecial(getText())) {
       $type = SpecialLiteral;
     }
   }
 ;
 类似资料:
  • 关于antlr4的几个问题使用了书中没有提到的lexer谓词,例如28730446使用了head(String),42058127使用了getCharPositionInLine(),23465358使用了_input.la(1)等。是否有可用的lexer谓词列表及其文档?

  • 查看文档,ANTLR2过去有一种叫做谓词法的东西,下面的例子是这样的(灵感来自Pascal): 在我看来,这实际上是规则开头的一个积极的前瞻性断言:如果前瞻性与匹配,那么第一个规则将被应用(并与该输入的部分匹配),依此类推。 我还没有在ANTLR4中找到这样的东西。2到3迁移指南似乎没有提到这一点,而3到4更改文档指出: ANTLR3和4之间最大的区别是ANTLR4接受您给出的任何语法,除非该语法

  • 基本上,我试图为lexer指定尝试匹配(LOWCHARHIGHCHAR)的非贪婪方式,因此它停止在关键字lookahead。到目前为止,我所读到的关于ANTLR lexer的内容是,应该有某种lexer规则的优先级。如果我在lexer语法中首先指定关键字lexer规则,那么后面的任何lexer规则都不能匹配所使用的字符。 经过一番搜索,我明白了这里的问题是它不能以正确的方式标记输入,因为例如对于输

  • 问题内容: 我正在为我的第一个应用程序浏览本教程(学习Swift):http : //www.appcoda.com/search-bar-tutorial- ios7/ 我被困在这部分(Objective-C代码): 谁能建议如何在Swift中为NSPredicate创建等效项? 问题答案: 这实际上只是语法切换。好,所以我们有这个方法调用: 在Swift中,构造函数跳过“ blahWith…”

  • 这里有一段代码: 它现在查找具有或日期在之后的的票据。我想改变这个。