簡體   English   中英

ANTLR4 java.lang.StackOverflowError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM