如何將語法文件中的自定義錯誤消息拋出到java類(解析和lexing被定義的地方)?在antlr3中從語法到Java拋出錯誤
< ----------解析器語法----------->
parser grammar EParser;
@members {
public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
String hdr = getErrorHeader(e);
String msg = getErrorMessage(e, tokenNames);
System.out.println("hdr and msg...."+hdr+">>>>>>"+msg);
throw new RuntimeException(hdr + ":" + msg);
}
}
prog
: stat+
;
stat
: expr SEMI
| ID EQU expr SEMI
;
expr
: multExpr ((PRM) multExpr)*
;
multExpr
: atom (MUL atom)*
;
atom
:INT| OPEN expr CLS
;
< ------------- ------ Java代碼--------------->
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
public class TestE {
public static void main(String[] args) throws Exception {
ELexer lexer = new ELexer(new ANTLRStringStream("a=9+8;"));
EParser parser = new EParser(new CommonTokenStream(lexer));
try
{
parser.prog();
System.out.println("Parsing successfully...");
}
catch (Exception e)
{
System.out.println("Other exception : " + e.toString());
}
}
}
< ------------------ Lexer語法-------------->
lexer grammar ELexer;
tokens
{
ID;
INT;
WS;
EQU;
PRM;
OPEN;
CLS;
SEMI;
MUL;
}
@members {
Stack<String> paraphrase = new Stack<String>();
}
ID :('a'..'z'|'A'..'Z')+ ;
INT : '0'..'9'+ ;
EQU:'=';
PRM:'+'|'-';
OPEN:'(';
SEMI:';';
CLS :')';
MUL:'*';
WS : (' '|'\t'|'\n'|'\r')+ {skip();} ;
這裏我的輸入是a=9+8
。
當我錯過8
它必須給錯誤信息爲「期待一個整數」,當我錯過;
它必須說「丟失分號」。我不得不產生錯誤信息(我不想要antlr產生的默認錯誤信息,我需要我自己的錯誤信息)。
我該如何做到這一點?是否必須在語法文件中寫入錯誤消息?或者java代碼?
投票反對,因爲這是一個有效(有趣)的問題已經有2個答案(這表明它足夠清楚要問什麼)。 –