Currenlty我的工作我自己的语法,我想对特定的错误消息NoViableAlternative,InputMismatch,UnwantedToken,MissingToken和LexerNoViableAltException。
我已经扩展Lexer.class并覆盖了notifyListeners将默认错误消息更改token recognition error at:为我自己的错误消息。同样,我扩展DefaultErrorStrategy并覆盖了所有报告方法,例如reportNoViableAlternative, reportInputMismatch, reportUnwantedToken, reportMissingToken。
所有这些的目的是更改消息,这些消息将传递给syntaxError()listener的方法ANTLRErrorListener。
这是扩展的一个小例子Lexer.class:
@Override
public void notifyListeners(LexerNoViableAltException lexerNoViableAltException) {
String text = this._input.getText(Interval.of(this._tokenStartCharIndex, this._input.index()));
String msg = "Operator " + this.getErrorDisplay(text) + " is unkown.";
ANTLRErrorListener listener = this.getErrorListenerDispatch();
listener.syntaxError(this, null, this._tokenStartLine, this._tokenStartCharPositionInLine, msg,
lexerNoViableAltException);
}
Run Code Online (Sandbox Code Playgroud)
或者对于DefaultErrorStrategy:
@Override
protected void reportNoViableAlternative(Parser recognizer, …Run Code Online (Sandbox Code Playgroud) 在网上做了一些研究之后,我发现这将是捕获异常并输出我自己的错误消息的方法.由于某种原因,我似乎仍然无法捕捉错误.下面是一个覆盖antlrs默认错误处理的类的代码.
我想要做的就是从antlr捕获异常并输出到java gui中语法不正确的屏幕.
public class ExceptionErrorStrategy extends DefaultErrorStrategy {
@Override
public void recover(Parser recognizer, RecognitionException e) {
throw e;
}
@Override
public void reportInputMismatch(Parser recognizer, InputMismatchException e) throws RecognitionException {
String msg = "Input is mismatched " + getTokenErrorDisplay(e.getOffendingToken());
msg += " expecting: "+e.getExpectedTokens().toString(recognizer.getTokenNames());
RecognitionException ex = new RecognitionException(msg, recognizer, recognizer.getInputStream(), recognizer.getContext());
ex.initCause(e);
throw ex;
}
@Override
public void reportMissingToken(Parser recognizer) {
beginErrorCondition(recognizer);
Token t = recognizer.getCurrentToken();
IntervalSet expecting = getExpectedTokens(recognizer);
String msg = "Missing "+expecting.toString(recognizer.getTokenNames()) + " at " …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 ANTLR4 将数学公式解析为 LaTeX 的子集。例如它应该解析(a+4)/(b*10)为\frac{a+4}{b\cdot 10}.
我的简单语法创建了一个这样的树:

现在我正在尝试实现解析树侦听器,以在遍历树时以某种方式构造 LaTeX 字符串。在这里,我失败了,因为构造一个像\frac{}{}它必须递归构建的字符串。然而,解析树遍历器一个接一个地访问树节点(据我所知,以广度优先的方式)。
我已经阅读了可能是我需要的解析树访问者。但是我无法找到一些如何应用这些访问者的示例。
您能否举例说明在这种特殊情况下如何使用解析树侦听器/访问器?您认为我首先将 ANTLR 用于解析器的方法有意义吗?