我从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>'


有谁知道这里的问题吗?

最佳答案

您的语法有一些错误:


词法分析器规则只能返回Token,因此在returns [String s]之后将忽略TKDC
backtrack=true部分中的options不适用于词法分析器规则,这就是为什么您得到mismatched character '9' expecting 'C'的原因(那里没有回溯!);
expr规则的内容:(LETTER SPACE DIGIT | TKDC) {$s = $DIGIT.text + $TKDC.text;}对我来说没有多大意义。您想要匹配LETTER SPACE DIGITTKDC,但是您试图同时获取两个选择的text$DIGIT.text$TKDC.text


在我看来,TKDC需要改为被提升为解析器规则。

我认为您对示例的研究过于愚蠢,无法说明您面临的问题。或许最好是解释一下您的实际问题:您想准确解析什么?

08-19 10:35