【发布时间】:2019-01-24 23:08:10
【问题描述】:
说明
我正在尝试创建一种自定义语言,我想将词法分析器规则与解析器规则分开。此外,我的目标是将词法分析器和解析器规则进一步划分为特定文件(例如,常用词法分析器规则和关键字规则)。
但我似乎无法让它工作。
虽然我在生成解析器(.java 文件)时没有遇到任何错误,但grun 失败并显示Exception in thread "main" java.lang.ClassCastException。
注意
我在面向 Java 的 Windows7 上运行 ANTLR4.7.2。
代码
我创建了一组与我打算实现的目标非常相似的文件。下面的示例定义了一种名为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
§
【问题讨论】:
标签: antlr4