我有一个非常简单的语法,如下所示:
grammar Testing;
a : d | b;
b : {_input.LT(1).equals("b")}? C;
d : {!_input.LT(1).equals("b")}? C;
C : .;
$ antlr Testing.g4
$ javac *.java
$ grun Testing a -trace (base)
c
enter a, LT(1)=c
enter d, LT(1)=c
consume [@0,0:0='c',<1>,1:0] rule d
exit d, LT(1)=
exit a, LT(1)=
$ grun Testing a -trace (base)
b
enter a, LT(1)=b
enter d, LT(1)=b
consume [@0,0:0='b',<1>,1:0] rule d
exit d, LT(1)=
exit a, LT(1)=
(我需要使用语义谓词,因为我需要解析关键字可以用作标识符的语言)。
参考:https://github.com/antlr/antlr4/blob/master/doc/predicates.md
_input.lt(int)
返回标记
,token.equals(String)
将始终返回false
。您要做的是在标记
上调用gettext()
:
b : {_input.LT(1).getText().equals("b")}? C;
d : {!_input.LT(1).getText().equals("b")}? C;
然而,通常以这样一种方式处理关键字作为标识符更容易:
rule
: KEYWORD_1 identifier
;
identifier
: IDENTIFIER
| KEYWORD_1
| KEYWORD_2
| KEYWORD_3
;
KEYWORD_1 : 'k1';
KEYWORD_2 : 'k2';
KEYWORD_3 : 'k3';
IDENTIFIER : [a-zA-Z_] [a-zA-Z_0-9]*;
我正在用这个缩放的语法解析一个类似C++的声明(删除了许多细节,使其成为一个完全可用的示例)。它不能神秘地工作(至少对我来说)。它是否与上下文相关谓词的使用有关?如果是,如何实现“计算子节点数逻辑”? 我需要实现标准的C++规则,即在下不允许超过1个。 在之前使用语义谓词似乎是解决方案。由于嵌套的是可能的,因此计数自然被声明为中的局部变量。 但是,一个不带'=0'的输入来帮助解析 分析失败,出现“
在使用语义谓词时,我在错误恢复中面临着一个有点奇怪的行为。 我需要错误恢复(特别是单标记插入),因为我将解析的文本有许多“单标记缺失”错误。 让语法(非常简单,它匹配任意数量的“a”,用空格分隔,以分号结尾): 运行以下输入,得到的解析树为: “A A A A;”:; “A A A”:(此命令在stderr上发出警告:line 1:5 missing’;'at')。 现在对语法做了一个简单的更改,
在ANTLR v3中,句法谓词可以用来解决例如悬空的else问题。ANTLR4似乎接受具有类似歧义的语法,但在解析过程中它会报告这些歧义(例如,“line 2:29 reportAmbiguity d=0(e):ambigalts={1,2},input=...”)。它生成一个解析树,尽管存在这些歧义(根据文档,通过选择第一个备选方案)。但如果我想让它选择其他选择,我能做什么呢?换句话说,我如何显
本文向大家介绍ANTLR 动作和语义谓词,包括了ANTLR 动作和语义谓词的使用技巧和注意事项,需要的朋友参考一下 示例 词法分析器操作是目标语言中由{...包围的任意代码块,该代码}在匹配期间执行: 语义谓词是目标语言中由{...包围的任意代码块}?,其结果为布尔值。如果返回的值为false,则跳过词法分析器规则。 出于性能原因,应尽可能在规则末尾定义语义谓词。