说明
我正在尝试创建一种自定义语言,我想将词法分析器规则与解析器规则分开。此外,我的目标是将词法分析器和解析器规则进一步划分为特定文件(例如,常见的词法分析器规则和关键字规则)。
但我似乎无法让它工作。
尽管我在生成解析器(.java
文件)时没有收到任何错误,但grun
失败并显示Exception in thread "main" java.lang.ClassCastException
.
注意
我正在Windows7上运行ANTLR 4.7.2
,目标是Java。
法典
我创建了一组文件,这些文件非常模仿我打算实现的目标。下面的示例定义了一种名为 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 : [ trn]+ -> channel(HIDDEN) ;
输出
这是我从上面的代码收到的确切输出:
ussjc-dd9vkc2 | C:Mwsalexample
§ antlr4.bat .MyLangL.g4
ussjc-dd9vkc2 | C:Mwsalexample
§ antlr4.bat .MyLang.g4
ussjc-dd9vkc2 | C:Mwsalexample
§ javac *.java
ussjc-dd9vkc2 | C:Mwsalexample
§ 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:Mwsalexample
§
使用 MyLangParser 和 MyLangLexer 重命名两个文件,然后运行grun MyLang prog -tree