Java 简单ANTLR错误
我从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
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规则只能返回
s,因此Token
在返回[String s]
之后被忽略李>TKDC
中的backtrack=true
部分不适用于lexer规则,这就是为什么选项
(没有回溯!)李>不匹配的字符“9”预期为“C”
- 你的
规则的内容:expr
对我来说没有多大意义。您可能希望匹配(字母空格数字| TKDC){$s=$DIGIT.text+$TKDC.text;}
或字母空格数字
,但您试图获取两个选项中的TKDC
:文本
和$DIGIT.text
$TKDC.text
TKDC
需要“升级”为解析器规则
我认为你把你的例子简化了一点,以说明你所面临的问题。也许更好的办法是解释你的实际问题:你到底想解析什么?你的语法有一些问题:
- lexer规则只能返回
s,因此Token
在返回[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>'