ANTLR4:使用单独语法时发生grun错误(ClassCastException) 描述

ANTLR4:使用单独语法时发生grun错误(ClassCastException) 描述,antlr4,Antlr4,我正在尝试创建一种自定义语言,以将lexer规则与解析器规则分离。此外,我的目标是将lexer和解析器规则进一步划分为特定的文件(例如,公共lexer规则和关键字规则) 但我似乎无法让它发挥作用 虽然在生成解析器(.java文件)时没有收到任何错误,grun失败,线程“main”java.lang.ClassCastException中出现异常 注 我正在Windows7上运行针对Java的ANTLR4.7.2 代码 我创建了一组文件,这些文件与我想要实现的目标非常相似。下面的示例定义了一种名为

我正在尝试创建一种自定义语言,以将lexer规则与解析器规则分离。此外,我的目标是将lexer和解析器规则进一步划分为特定的文件(例如,公共lexer规则和关键字规则)

但我似乎无法让它发挥作用

虽然在生成解析器(
.java
文件)时没有收到任何错误,
grun
失败,线程“main”java.lang.ClassCastException中出现
异常

注 我正在Windows7上运行针对Java的ANTLR
4.7.2

代码 我创建了一组文件,这些文件与我想要实现的目标非常相似。下面的示例定义了一种名为
MyLang
的语言,并将lexer和parser语法分开。此外,我将lexer规则拆分为四个文件:

  • 输出 以下是我从上述代码中获得的确切输出:

    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    § antlr4.bat .\MyLangL.g4
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    § antlr4.bat .\MyLang.g4
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    § javac *.java
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    § grun MyLang prog -tree
    Exception in thread "main" java.lang.ClassCastException: class MyLang
            at java.lang.Class.asSubclass(Unknown Source)
            at org.antlr.v4.gui.TestRig.process(TestRig.java:135)
            at org.antlr.v4.gui.TestRig.main(TestRig.java:119)
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    §
    

    使用MyLangParser和MyLangXer重命名这两个文件,然后运行
    grun MyLang prog-tree

    // MyLangL.g4
    lexer grammar MyLangL;
    
    import SkipWhitespaceL, CommonL, KeywordL;
    
    @header {
    package com.invensense.wiggler.lexer;
    }
    
    @lexer::members {   // place this class member only in lexer
    Map<String,Integer> keywords = new HashMap<String,Integer>() {{
        put("for",          MyLangL.KW_FOR);
        /* add more keywords here */
    }};
    }
    
    ID  :   [a-zA-Z]+
            {
            if ( keywords.containsKey(getText()) ) {
                setType(keywords.get(getText())); // reset token type
            }
            }
        ;
    
    DIR
        : 'in'
        | 'out'
        ;
    
    END : 'end' ;
    
    // KeywordL.g4
    lexer grammar KeywordL;
    
    @lexer::header {    // place this header action only in lexer, not the parser
    import java.util.*;
    }
    
    // explicitly define keyword token types to avoid implicit def warnings
    tokens {
        KW_FOR
        /* add more keywords here */
    }
    
    // CommonL.g4
    lexer grammar CommonL;
    
    NUMBER
        : FLOAT
        | INT
        | UINT
        ;
    
    FLOAT
        : NEG? DIGIT+ '.' DIGIT+ EXP?
        | INT
        ;
    
    INT
        : NEG? UINT+
        ;
    
    UINT
        : DIGIT+ EXP?
        ;
    
    OPERATOR
        : OP_ASSIGN
        | OP_ADD
        | OP_SUB
        ;
    
    OP_ASSIGN   : ':=';
    OP_ADD      : POS;
    OP_SUB      : NEG;
    
    L_BRKT          : '[' ;
    R_BRKT          : ']' ;
    L_PAREN         : '(' ;
    R_PAREN         : ')' ;
    SEMICOLON       : ';' ;
    
    fragment EXP
        : [Ee] SIGN? DIGIT+
        ;
    
    fragment SIGN
        : POS
        | NEG
        ;
    
    fragment POS: '+' ;
    fragment NEG : '-' ;
    fragment DIGIT : [0-9];
    
    // SkipWhitespaceL.g4
    lexer grammar SkipWhitespaceL;
    
    WS
        :   [ \t\r\n]+ -> channel(HIDDEN)
        ;
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    § antlr4.bat .\MyLangL.g4
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    § antlr4.bat .\MyLang.g4
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    § javac *.java
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    § grun MyLang prog -tree
    Exception in thread "main" java.lang.ClassCastException: class MyLang
            at java.lang.Class.asSubclass(Unknown Source)
            at org.antlr.v4.gui.TestRig.process(TestRig.java:135)
            at org.antlr.v4.gui.TestRig.main(TestRig.java:119)
    
    ussjc-dd9vkc2 | C:\M\w\s\a\l\example
    §