2016-03-26 8 views
0

私はANTLRでかなり簡単な言語を書いています。ユーザーが書いたコードを実際に解釈する前に、コードを解析して構文エラーをチェックしたいと思います。見つかった場合は、エラーの原因を出力して終了します。どのようにコードの構文エラーをチェックし、対応するエラーを出力できますか?私の目的のために、ANTLRツールで生成されたものと同様のエラーステートメントは十分ではありません。たとえば、ANTLRの構文エラーをチェックするために構文解析ツリーを移動する方法

line 3:0 missing ';' 
+0

さて、パーサを生成してクエリを実行し、エラーメッセージを取得してください。 –

答えて

0

詳細情報を取得するために使用できる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に問い合わせることができます。

+0

詳細を教えてください。私は初心者です。あなたが私にいくつかの例を与えたり、どこから始めるべきかを指摘したりすることができれば、非常に役に立ちます。 – Ray

関連する問題