【问题标题】:why does 'a'..'z' in ANTLR match wildcards like $ or £为什么 ANTLR 中的 'a'..'z' 匹配 $ 或 £ 等通配符
【发布时间】:2010-07-06 17:16:31
【问题描述】:

当我运行以下语法时:

test : WORD+;

WORD : ('a'..'z')+;
WS : ' '+ {$channel = HIDDEN;};

我输入“?test”,为什么 antlr 接受这个作为有效输入?我以为 ('a'..'z') 只会匹配小写字母中的字符?

【问题讨论】:

  • 我也这么认为。你确定吗 ?你是说 "?test" 被解析为 WORD 标记?
  • 是的,就是这样。我正在使用antlr3 IDE for eclipse来测试它...

标签: lexer antlr3 ebnf


【解决方案1】:

ANTLR 确实在使用您发布的语法解析输入字符串?test 时会产生错误。通常情况下,错误在于围绕 ANTLR 使用的工具(不幸的是,我看到 ANTLRWorks 也经常发生这种情况!)。

要自己测试(正确),请创建一个文件Test.g

grammar Test;

test : WORD+;

WORD : ('a'..'z')+;

WS   : ' '+ {$channel = HIDDEN;};

还有一个文件Main.java

import org.antlr.runtime.*;

public class Main {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("?test");
        TestLexer lexer = new TestLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TestParser parser = new TestParser(tokens);
        parser.test();
    }
}

并在同一目录中下载ANTLR 3.2 JAR 的副本。

现在生成一个词法分析器和解析器:

java -cp antlr-3.2.jar org.antlr.Tool Test.g 

编译所有Java源文件:

javac -cp antlr-3.2.jar *.java

并运行 Main 类:

java -cp .:antlr-3.2.jar Main 

(如果您使用的是 Windows,请将 : 替换为 ;!)

这将产生以下错误消息:

line 1:0 no viable alternative at character '?'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 2016-08-15
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多