[英]ANTLR4 throws java.lang.StackOverflowError on longer files
[英]ANTLR4 java.lang.StackOverflowError
我是 Antlr4 的新手,我編寫了一個可以成功編譯的簡單語法文件,但是當我嘗試驗證示例輸入時它會引發 Stackoverflow 異常。
語法文件:
grammar SampleGrammar;
options {
language = Java;
}
expression : (c1=someName|a1=attrName) OP literal #clauseOperation
;
someName: MY;
attrName : (attribute '.')any_name;
attribute : ATTRIBUTE;
any_name : IDENT;
literal : NULL | INTEGER | NUMBER | TRUE | FALSE | STRING;
ATTRIBUTE : A T T R I B U T E;
OP : '=' | '!=';
MY : M Y;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ -> skip;
NULL : N U L L;
TRUE : T R U E;
FALSE : F A L S E;
INTEGER : '-'? [0-9]+;
NUMBER : '-'? [0-9]* ( '.' [0-9]+);
STRING : '\'' (ESC|.)*? '\'';
IDENT : [a-zA-Z][a-zA-Z0-9-_]*;
fragment A : 'A' | 'a' ;
fragment B : 'B' | 'b' ;
fragment C : 'C' | 'c' ;
fragment D : 'D' | 'd' ;
fragment E : 'E' | 'e' ;
fragment F : 'F' | 'f' ;
fragment G : 'G' | 'g' ;
fragment H : 'H' | 'h' ;
fragment I : 'I' | 'i' ;
fragment J : 'J' | 'j' ;
fragment K : 'K' | 'k' ;
fragment L : 'L' | 'l' ;
fragment M : 'M' | 'm' ;
fragment N : 'N' | 'n' ;
fragment O : 'O' | 'o' ;
fragment P : 'P' | 'p' ;
fragment Q : 'Q' | 'q' ;
fragment R : 'R' | 'r' ;
fragment S : 'S' | 's' ;
fragment T : 'T' | 't' ;
fragment U : 'U' | 'u' ;
fragment V : 'V' | 'v' ;
fragment W : 'W' | 'w' ;
fragment X : 'X' | 'x' ;
fragment Y : 'Y' | 'y' ;
fragment Z : 'Z' | 'z' ;
fragment ESC : '\\\'' | '\\\\';
測試輸入:
它總是拋出 StackOverFlowException。 我按照以下步驟操作:
export CLASSPATH=".:/c/work/antlr/antlr4-4.8-1-complete.jar:$CLASSPATH"
alias antlr4='java -Xmx4g -cp "/c/work/antlr/antlr4-4.8-1-complete.jar:$CLASSPATH" org.antlr.v4.Tool'
alias grun='java org.antlr.v4.gui.TestRig'
antlr4 SampleGrammar.g4
javac SampleGrammar*.java
grun SampleGrammar expression input.txt -gui
input.txt: MY="我的名字"
拋出:
Exception in thread "main" java.lang.StackOverflowError
at org.antlr.v4.runtime.misc.MurmurHash.update(MurmurHash.java:71)
at org.antlr.v4.runtime.atn.LexerATNConfig.hashCode(LexerATNConfig.java:78)
at org.antlr.v4.runtime.misc.ObjectEqualityComparator.hashCode(ObjectEqualityComparator.java:29)
at org.antlr.v4.runtime.misc.Array2DHashSet.getBucket(Array2DHashSet.java:108)
at org.antlr.v4.runtime.misc.Array2DHashSet.getOrAddImpl(Array2DHashSet.java:63)
at org.antlr.v4.runtime.misc.Array2DHashSet.getOrAdd(Array2DHashSet.java:59)
at org.antlr.v4.runtime.atn.ATNConfigSet.add(ATNConfigSet.java:146)
at org.antlr.v4.runtime.atn.ATNConfigSet.add(ATNConfigSet.java:122)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:446)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:455)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:455)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:455)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:455)
不知道我錯過了什么。 此處共享的示例語法很好用
看來您的角色 class [a-zA-Z0-9-_]
中的無效范圍9-_
是罪魁禍首。 如果您正確轉義-
,則不會引發異常:
IDENT : [a-zA-Z][a-zA-Z0-9\-_]*;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.