私はANTLRでかなり簡単な言語を書いています。ユーザーが書いたコードを実際に解釈する前に、コードを解析して構文エラーをチェックしたいと思います。見つかった場合は、エラーの原因を出力して終了します。どのようにコードの構文エラーをチェックし、対応するエラーを出力できますか?私の目的のために、ANTLRツールで生成されたものと同様のエラーステートメントは十分ではありません。たとえば、ANTLRの構文エラーをチェックするために構文解析ツリーを移動する方法
line 3:0 missing ';'
私はANTLRでかなり簡単な言語を書いています。ユーザーが書いたコードを実際に解釈する前に、コードを解析して構文エラーをチェックしたいと思います。見つかった場合は、エラーの原因を出力して終了します。どのようにコードの構文エラーをチェックし、対応するエラーを出力できますか?私の目的のために、ANTLRツールで生成されたものと同様のエラーステートメントは十分ではありません。たとえば、ANTLRの構文エラーをチェックするために構文解析ツリーを移動する方法
line 3:0 missing ';'
詳細情報を取得するために使用できるErrorListenerがあります。例えば
:あなたがする必要がある
...
FormulaParser parser = new FormulaParser(tokens);
parser.IsCompletion = options.IsForCompletion;
ErrorListener errListener = new ErrorListener();
parser.AddErrorListener(errListener);
IParseTree tree = parser.formula();
だけの事はパーサーには、ErrorListenerを添付することです。 ErrorListenerのコードは次のとおりです。
/// <summary>
/// Error listener recording all errors that Antlr parser raises during parsing.
/// </summary>
internal class ErrorListener : BaseErrorListener
{
private const string Eof = "the end of formula";
public ErrorListener()
{
ErrorMessages = new List<ErrorInfo>();
}
public bool ErrorOccured { get; private set; }
public List<ErrorInfo> ErrorMessages { get; private set; }
public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
ErrorOccured = true;
if (e == null || e.GetType() != typeof(NoViableAltException))
{
ErrorMessages.Add(new ErrorInfo()
{
Message = ConvertMessage(msg),
StartIndex = offendingSymbol.StartIndex,
Column = offendingSymbol.Column + 1,
Line = offendingSymbol.Line,
Length = offendingSymbol.Text.Length
});
return;
}
ErrorMessages.Add(new ErrorInfo()
{
Message = string.Format("{0}{1}", ConvertToken(offendingSymbol.Text), " unexpected"),
StartIndex = offendingSymbol.StartIndex,
Column = offendingSymbol.Column + 1,
Line = offendingSymbol.Line,
Length = offendingSymbol.Text.Length
});
}
public override void ReportAmbiguity(Antlr4.Runtime.Parser recognizer, DFA dfa, int startIndex, int stopIndex, bool exact, BitSet ambigAlts, ATNConfigSet configs)
{
ErrorOccured = true;
ErrorMessages.Add(new ErrorInfo()
{
Message = "Ambiguity", Column = startIndex, StartIndex = startIndex
});
base.ReportAmbiguity(recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs);
}
private string ConvertToken(string token)
{
return string.Equals(token, "<EOF>", StringComparison.InvariantCultureIgnoreCase)
? Eof
: token;
}
private string ConvertMessage(string message)
{
StringBuilder builder = new StringBuilder(message);
builder.Replace("<EOF>", Eof);
return builder.ToString();
}
}
これはダミーリスナーですが、その動作を確認できます。そして、エラーが構文エラーであるか、あいまいエラーであるかを知ることができます。解析後、何らかのエラーが発生した場合は、直接errorListenerに問い合わせることができます。
詳細を教えてください。私は初心者です。あなたが私にいくつかの例を与えたり、どこから始めるべきかを指摘したりすることができれば、非常に役に立ちます。 – Ray
さて、パーサを生成してクエリを実行し、エラーメッセージを取得してください。 –