java - 简单的 ANTLR 错误

标签 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 : '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,因此 返回 [String s]TKDC 之后会被忽略;
  • options 部分中的backtrack=true不适用于词法分析器规则,这就是为什么您会得到不匹配的字符“9”,需要“C”(那里没有回溯!);
  • 您的expr规则的内容:(LETTER SPACE DIGIT | TKDC) {$s = $DIGIT.text + $TKDC.text;}(对我来说)没有多大意义。您想要匹配LETTER SPACE DIGITTKDC,但您试图获取这两个选项的文本:$DIGIT.text$TKDC.text

在我看来,TKDC 需要“升级”为解析器规则。

我认为您简化了您的示例,无法说明您所面临的问题。也许更好的主意是解释你的实际问题:你想准确解析什么?

关于java - 简单的 ANTLR 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594539/

相关文章:

java - 如何使用 OR 和汇总函数构建高级 Hibernate Query

java - 添加原子 double

java - 使用OutputStreamWriter和 "UTF-8"参数的Js/Java写入文件会产生ANSI编码文件

java - ANTLR3 中的自定义初始化/清理

c# - 如何为单独的 ANTLR 词法分析器和解析器添加虚构标记?

java - thymeleaf 中的 if 语句

parsing - ANTLR 歧义 '-'

java - ANTLR忽略oracle脚本中的 "/"

antlr - 编写 ANTLR 目标

java - 对于ANTLR3异常,antlrworks可以工作,但生成的java代码无法工作