我从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“结果:
import org.antlr.runtime.*;
class Testantlr {
public static void main(String[] args) throws Exception {
ExprLexer lex = new ExprLexer(new ANTLRFileStream(args[0]));
CommonTokenStream tokens = new CommonTokenStream(lex);
ExprParser parser = new ExprParser(tokens);
try {
System.out.println(parser.expr());
} catch (RecognitionException e) {
e.printStackTrace();
}
}
}当我的输入文件有以下内容d 9时,就会出现问题。
我得到以下错误:
x line 1:2 mismatched character '9' expecting 'C'
x line 1:3 no viable alternative at input '<EOF>'这里有人知道这个问题吗?
发布于 2011-07-06 10:17:18
你的语法有几处问题:
TKDC;
backtrack=true部分中的Tokens,所以在options部分中的returns [String s]不适用于Token规则之后,returns [String s]就被忽略了,这就是为什么您得到mismatched character '9' expecting 'C' (在那里没有回溯!);expr规则的内容:(LETTER SPACE DIGIT | TKDC) {$s = $DIGIT.text + $TKDC.text;}没有什么意义(对我来说)。你要么想要匹配LETTER SPACE DIGIT或TKDC,但你却试图抓住这两种选择的text:$DIGIT.text和TKDC在我看来,TKDC需要“提升”为解析器规则。
我认为你把你的例子写得太少了,无法说明你所面临的问题。也许更好的方法是解释你的实际问题:你到底想解析什么?
https://stackoverflow.com/questions/6594539
复制相似问题