gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:49:39 29 4
gpt4 key购买 nike

描述

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

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

尽管我在生成解析器( .java 文件)时没有遇到任何错误,grun失败 Exception in thread "main" java.lang.ClassCastException .

笔记

我正在运行 ANTLR 4.7.2在面向 Java 的 Windows7 上。

代码

我创建了一组文件来模拟我打算实现的目标。下面的示例定义了一种名为 MyLang 的语言并分离词法分析器和解析器语法。另外,我将词法分析器规则拆分为四个文件:

  • // 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
    §

    最佳答案

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

    关于ANTLR4:使用单独的语法时出现错误 (ClassCastException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54356701/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com