为什么语义谓词在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]*;