当前位置: 首页 > 知识库问答 >
问题:

ANTLR4:使用单独语法时出现grun错误(ClassCastException)

谢泉
2023-03-14

我试图创建一种自定义语言,将lexer规则与parser规则分开。此外,我的目标是进一步将lexer和parser规则划分到特定的文件中(例如,通用lexer规则和关键字规则)。

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

  1. // MyLang.g4
    parser grammar MyLang;
    
    options { tokenVocab = MyLangL; }
    
    prog
        : ( func )* END
        ;
    
    func
        : DIR ID L_BRKT  (stat)* R_BRKT
        ;
    
    stat
        : expr SEMICOLON
        | ID OP_ASSIGN expr SEMICOLON
        | SEMICOLON
        ;
    
    expr
        : expr OPERATOR expr
        | NUMBER
        | ID
        | L_PAREN expr R_PAREN
        ;
    
    // 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
    §
    

共有1个答案

桂阳文
2023-03-14

使用MyLangParser和MyLangLexer重命名文件,然后运行grun MyLang prog-tree

 类似资料:
  • 我正在努力学习ANTLR4,并遵循ANTLR4权威参考中给出的示例。可悲的是,我被第一个例子卡住了。 系统: Windows 10(1703) Java 8,更新151 ANTLR 4,V4.7 我的问题是: 当我对示例语法()运行时,我会得到以下错误消息 对我做错了什么有什么想法吗? 非常感谢! 编辑: 我以为我找到了答案。通过-ing到编译文件所在的文件夹(而不是从根项目文件夹调用),我设法完

  • 我正在使用GitHub提供的antlr4语法分析器和词法分析器来解析Python3中的PHP。 当我直接使用这些语法时,我的PoC代码工作: antlr试验。py 这给出了输出 当我使用以下PHP时。g4语法,我犯了很多错误: 在对pythons导入交换评论之后,我得到了这个错误 然而,当我在语法上运行antlr4工具时,我没有出错。我在这里被难住了——是什么导致了这个问题?

  • 我需要antlr4来解析一些简单的HTML文件。我已经将语法分为解析器语法和lexer语法,这样我就可以对标记内部的东西( )使用孤岛语法,如“确定的ANTLR4引用”中所述。antlr4反复告诉我“令牌识别错误”。 解析器语法: 示例HTML文件: ANTLR4的输出:

  • 我在这里使用的是一步语法,当我运行grun时,它非常有效: 但是,当使用具有以下代码的生成的java解析器运行时: 我得到这个错误:

  • 问题内容: 为什么在Python 3中打印字符串时会收到语法错误? 问题答案: 此错误消息表示你尝试使用Python 3遵循示例或运行使用Python 2t语句的程序: 上面的语句在Python 3中不起作用。在Python 3中,你需要在要打印的值周围添加括号: “ SyntaxError:对’print’的调用中缺少括号”是Python 3.4.2中添加的新错误消息,主要用于帮助试图在运行Py

  • 我正在尝试创建一个语法来解析Solr查询(只需要稍微相关,您不需要了解任何关于Solr的信息来回答这个问题--只需要比我了解更多关于ANTLR4.7的信息就可以了)。我将它建立在Solr6中的QueryParser.jj文件的基础上。我找了一个现存的,但似乎没有一个不是旧的和过时的。 我被困住了,因为当我尝试运行解析器时,我得到了“token recognition error”。 我创建的lex