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