为什么语义谓词在ANTLR4中不起作用
我有一个非常简单的语法,如下所示:为什么语义谓词在ANTLR4中不起作用,antlr,antlr4,Antlr,Antlr4,我有一个非常简单的语法,如下所示: grammar Testing; a : d | b; b : {_input.LT(1).equals("b")}? C; d : {!_input.LT(1).equals("b")}? C; C : .; 它从输入中解析一个字符,并检查它是否等于字符b。如果是,则使用规则b,如果不是,则使用规则d 但是,解析树没有达到预期效果,并使用第一条规则(规则d)解析所有内容 $antlr Testing.g4 $ja
grammar Testing;
a : d | b;
b : {_input.LT(1).equals("b")}? C;
d : {!_input.LT(1).equals("b")}? C;
C : .;
它从输入中解析一个字符,并检查它是否等于字符b。如果是,则使用规则b,如果不是,则使用规则d
但是,解析树没有达到预期效果,并使用第一条规则(规则d)解析所有内容
$antlr Testing.g4
$javac*.java
$grun测试a-跟踪(基本)
C
输入a,LT(1)=c
输入d,LT(1)=c
消耗[@0,0:0='c',1:0]规则d
出口d,LT(1)=
出口a,LT(1)=
$grun测试a-跟踪(基本)
B
输入a,LT(1)=b
输入d,LT(1)=b
消耗[@0,0:0='b',1:0]规则d
出口d,LT(1)=
出口a,LT(1)=
在这两种情况下,都使用规则d。然而,由于规则d上有一个保护,我希望当第一个字符正好是“b”时,规则d会失败
我在使用语义谓词时是否做错了什么
(我需要使用语义谓词,因为我需要解析一种可以将关键字用作标识符的语言)
参考:\u input.LT(int)
返回一个标记
,而标记。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]*;
非常感谢。当我试图简化语法时,getText是一个错误,而我实际上遇到了麻烦。但是你的建议解决了我的问题。非常感谢。
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]*;