Java 简单ANTLR错误

Java 简单ANTLR错误,java,antlr,antlr3,Java,Antlr,Antlr3,我从ANTLR开始,但是我遇到了一些错误,我真的不明白为什么 这是我的简单语法 grammar Expr; options {backtrack=true;} @header {} @members {} expr returns [String s] : (LETTER SPACE DIGIT | TKDC) {$s = $DIGIT.text + $TKDC.text;} ; // TOKENS SPACE : ' ' ; LETTER : 'd' ; DIGIT

我从ANTLR开始,但是我遇到了一些错误,我真的不明白为什么

这是我的简单语法

grammar Expr;
options {backtrack=true;}

@header {}

@members {}

expr returns [String s] 
    : (LETTER SPACE DIGIT | TKDC) {$s = $DIGIT.text + $TKDC.text;}
    ;

// TOKENS
SPACE : ' ' ;
LETTER : 'd' ;
DIGIT : '0'..'9' ;
TKDC returns [String s] : 'd' SPACE 'C' {$s = "d C";} ;
这是JAVA源代码,我只要求得到“expr”结果:

当我的输入文件包含以下内容时,就会出现问题d9

我得到以下错误:

x line 1:2 mismatched character '9' expecting 'C'
x line 1:3 no viable alternative at input '<EOF>'
x行1:2不匹配的字符“9”应为“C”
x行1:3输入“”处无可行的备选方案

有人知道这个问题吗?

你的语法有几处错误:

  • lexer规则只能返回
    Token
    s,因此
    返回[String s]
    TKDC
    之后被忽略
  • backtrack=true
    中的
    选项
    部分不适用于lexer规则,这就是为什么
    不匹配的字符“9”预期为“C”
    (没有回溯!)
  • 你的
    expr
    规则的内容:
    (字母空格数字| TKDC){$s=$DIGIT.text+$TKDC.text;}
    对我来说没有多大意义。您可能希望匹配
    字母空格数字
    TKDC
    ,但您试图获取两个选项中的
    文本
    $DIGIT.text
    $TKDC.text
在我看来,
TKDC
需要“升级”为解析器规则


我认为你把你的例子简化了一点,以说明你所面临的问题。也许更好的办法是解释你的实际问题:你到底想解析什么?

你的语法有一些问题:

  • lexer规则只能返回
    Token
    s,因此
    返回[String s]
    TKDC
    之后被忽略
  • backtrack=true
    中的
    选项
    部分不适用于lexer规则,这就是为什么
    不匹配的字符“9”预期为“C”
    (没有回溯!)
  • 你的
    expr
    规则的内容:
    (字母空格数字| TKDC){$s=$DIGIT.text+$TKDC.text;}
    对我来说没有多大意义。您可能希望匹配
    字母空格数字
    TKDC
    ,但您试图获取两个选项中的
    文本
    $DIGIT.text
    $TKDC.text
在我看来,
TKDC
需要“升级”为解析器规则


我认为你把你的例子简化了一点,以说明你所面临的问题。也许更好的办法是解释你的实际问题:你到底想解析什么?

谢谢你的回答;)我已经删除了返回值[String s],以及bactrack=true,但仍然收到“mismatched”错误。我在尝试做一个完整的日期解析器时遇到了这个错误,其中的日期可能包括“dc”和“ac”部分。正如您所建议的,我解决了这个问题,将TKDC提升为解析器规则,但我仍然不知道像这样的lexer规则有什么问题
TKDC:'d'SPACE'C'
@xavivars,是的,我没有特别提到原因:你得到了错误,因为一旦lexer“看到”
d
(a
'd'
后跟一个空格),它会尝试匹配
TKDC
令牌(它不在那里)。这就是我在第二个子弹中关于lexer而不是反向跟踪的意思。希望这能澄清这一点。当然,不客气。哦,所以不可能定义“不明确的标记”。谢谢;)谢谢你的回答;)我已经删除了返回值[String s],以及bactrack=true,但仍然收到“mismatched”错误。我在尝试做一个完整的日期解析器时遇到了这个错误,其中的日期可能包括“dc”和“ac”部分。正如您所建议的,我解决了这个问题,将TKDC提升为解析器规则,但我仍然不知道像这样的lexer规则有什么问题
TKDC:'d'SPACE'C'
@xavivars,是的,我没有特别提到原因:你得到了错误,因为一旦lexer“看到”
d
(a
'd'
后跟一个空格),它会尝试匹配
TKDC
令牌(它不在那里)。这就是我在第二个子弹中关于lexer而不是反向跟踪的意思。希望这能澄清这一点。当然,不客气。哦,所以不可能定义“不明确的标记”。谢谢;)
x line 1:2 mismatched character '9' expecting 'C'
x line 1:3 no viable alternative at input '<EOF>'