web-dev-qa-db-ja.com

Antlr4 C#アプリケーションのチュートリアル/例

Antlr4を使用して、C#アプリケーションのいくつかのファイルを解析したいと思います。これまでのところ、文法を使用してパーサーファイルとレクサーファイルを生成することができました。ここで、ファイルの読み取りを使用して、パーサーとレクサーをファイルに適用したいと思います。私はそれを行う方法についてのドキュメントを探していましたが、私は不足しています。以前のバージョンのAntlrを使用した古い例をいくつか見つけましたが、Antlr4では機能しないようです。どんな助けでもいただければ幸いです。ありがとう。

16
Neil Pittman
  • Visual Studioで、[ツール]-> [拡張機能と更新]に移動し、オンラインセクションでSamHarwellによる「ANTLR言語サポート」を検索します。詳細については、 GitHubプロジェクトサイト を参照してください。
    • これはいくつかのことを行います:
      • 結合された文法のテンプレートを追加します。
      • 構文の強調表示を追加
      • 文法のMSBuildターゲットを追加して、パーサーを生成します。
  • ソリューションでは、次のようにプロジェクト構造を設定します。
    • 解決
      • GrammarProject
        • 電卓.g4
      • ImplementationProject
        • GeneratedFiles(このフォルダー内のすべてのファイルは、GrammarProject\obj\Debugにあるファイルへのリンクとして追加されます)
          • CalculatorBaseListener.cs
          • CalculatorBaseVisitor.cs
          • CalculatorLexer.cs
          • CalculatorListener.cs
          • CalculatorParser.cs
          • CalculatorVistor.cs
        • MyCalcualtorImplementation.cs
  • 文法を書いてコンパイルします。
  • 生成されたファイルへのリンクのフォルダーで、フォルダーを右クリックし、[追加]-> [既存のアイテム]をクリックします。
  • Grammar Project\obj\Debugを参照し、生成されたすべてのパーサーファイルを選択します。
  • この次のステップは重要です。 [追加]ボタンには、小さなドロップダウン矢印があります。ドロップダウン矢印をクリックし、[リンクとして追加]をクリックします。
    • これにより、直接コピーの代わりにシンボリックリンクを使用して、生成されたファイルが実装プロジェクトに追加されます。
    • これにより、後で文法を変更する必要がある場合に、パーサーファイルを削除して再度追加する必要がないという追加の利点が得られます。
  • ここまで進んだら、使用することを決定した開発パターンに応じて、GrammarProject.CalculatorBaseListenerまたはGrammarProject.CalculatorBaseParserから継承できます。

補足として、 "The Definitive ANTLR 4 Reference" by Terence Parrは、ANTLR4の動作と開発パターンの違いを理解するための優れたリソースです。すべての例はJavaですが、概念はJavaとC#の両方に適用されます。

28
Esten

で試してみてください

using (StreamReader fileStream = new StreamReader(fileName)) {
    AntlrInputStream inputStream = new AntlrInputStream(fileStream);

    SearchLexer lexer = new SearchLexer(inputStream);
    CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
    SearchParser parser = new SearchParser(commonTokenStream);

    parser.RemoveErrorListeners();
    parser.AddErrorListener(new ErrorListener()); // add ours

    parser.root();
}
11
Narkha

これがErrorListenerのサンプルです

public class ErrorListener : BaseErrorListener
{
    public void SyntaxError(IRecognizer recognizer, int offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
    {
        Console.WriteLine("{0}: line {1}/column {2} {3}", e, line, charPositionInLine, msg);
    }
}
1
Jone