【问题标题】:ANTLR extraneous input x expecting xANTLR 无关输入 x 期望 x
【发布时间】:2018-03-26 07:53:04
【问题描述】:

我正在尝试匹配一个非常基本的 ANTLR 语法。但是ANTLR一直告诉我他得到了输入'。并期待“。” .

完整的错误是:

line 1:0 extraneous input '.' expecting '.'
line 1:2 missing '*' at '<EOF>'

附文法:

grammar regex;

@parser::header
{
    package antlr;
}

@lexer::header
{
    package antlr;
}


WHITESPACE : (' ' | '\t' | '\n' | '\r') -> channel(HIDDEN);
COMP       : '.';
KLEENE     : '*';

start : COMP KLEENE;

然后输入:

.*

两个文件具有相同的字符集:

regex.g: text/plain; charset=us-ascii
test.grammar: text/plain; charset=us-ascii

不应混淆 Lexer 规则。为什么这不能按预期工作?

【问题讨论】:

  • 您是否检查过该点在语法和输入中是同一个字符,即这不是另一个看起来相同的不同 unicode 字符?
  • 我将语法中的点复制到输入文件中。所以,它们应该是一样的。

标签: antlr


【解决方案1】:

鉴于您的示例语法和这个测试类:

import org.antlr.v4.runtime.*;

public class Main {
  public static void main(String[] args) {
    String source = ".*";
    regexLexer lexer = new regexLexer(CharStreams.fromString(source));
    regexParser parser = new regexParser(new CommonTokenStream(lexer));
    System.out.println(parser.start().toStringTree(parser));
  }
}

以下内容打印到我的控制台:

(start . *)

我的猜测是你要么过于简化语法导致原始语法中的错误消失,要么你没有生成新的词法分析器/解析器类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多