lexer - 为什么是 'a' 。 ANTLR 中的 .'z' 匹配 $ 或 £ 等通配符

标签 lexer antlr3 ebnf

当我运行以下语法时:

test : WORD+;

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

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

最佳答案

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

并运行主类:

java -cp .:antlr-3.2.jar Main 

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

这将产生以下错误消息:

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

关于lexer - 为什么是 'a' 。 ANTLR 中的 .'z' 匹配 $ 或 £ 等通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3188574/

相关文章:

antlr - 如何在antlr3的树语法中捕获标记列表?

java - ANTLR : rules with arguments?

python - 字典和字符串

c - 词法分析器将标识符的一部分识别为关键字

antlr - ANTLR中是否存在逻辑AND和NOT?

java - 使用 javax.lang.model 或 ANTLR JavaParser 获取 Java 源代码信息的示例/教程

parsing - 扩展的巴科斯诺尔形式 (EBNF) 能否描述一组无序的值?

python - "FailedParse: [...] Expecting end of text"尝试解析 grako 中带括号的表达式时

parsing - 用于(非)结构化文本文档的词法分析器/解析器

C 预处理器为多种类型赋值