2013-10-11 11 views
12

Ich möchte Antlr4 verwenden, um einige Dateien in meiner C# -Anwendung zu analysieren. Ich bin in der Lage, die Parser- und Lexer-Dateien zu generieren, soweit ich meine Grammatik angegeben habe. Jetzt möchte ich die Dateien einlesen und den Parser und Lexer auf sie anwenden. Ich habe nach einer Dokumentation gesucht, wie das geht, aber ich komme zu kurz. Ich habe einige alte Beispiele mit früheren Versionen von Antlr gefunden, aber sie scheinen nicht für Antlr4 zu funktionieren. Jede Hilfe wäre willkommen. Vielen Dank.Antlr4 C# -Anwendung Tutorial/Beispiel

Antwort

10

versuchen mit

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(); 
} 
22
  • in Visual Studio gehen Sie auf Extras -> Erweiterungen und Updates und den Online-Bereich für "ANTLR Language Support" von Sam Harwell suchen.
    • Fügen Vorlagen für die kombinierten Grammatiken: Weitere Informationen finden Sie auf dem Dies hat ein paar Dinge GitHub project site
      • finden.
      • Fügt Syntax-Hervorhebung hinzu
      • Fügt ein MSBuild-Ziel für die Grammatik hinzu, um den Parser zu generieren.
  • In Ihrer Lösung, stellen Sie Ihre Projektstruktur wie folgt auf:
    • Lösung
      • GrammarProject
        • Calculator.g4
      • ImplementationProj ect
        • GeneratedFiles (alle Dateien in diesem Ordner werden als Links zu Dateien befinden in GrammarProject \ obj \ Debug hinzugefügt)
          • CalculatorBaseListener.cs
          • CalculatorBaseVisitor.cs
          • CalculatorLexer.cs
          • CalculatorListener.cs
          • RechnerParser.cs
          • CalculatorVistor.cs
        • MyCalcualtorImplementation.cs
  • schreiben und Ihre Grammatik Kompilieren.
  • In Ihrem Ordner für die Links zu generierten Dateien mit der rechten Maustaste auf den Ordner und klicken Sie auf Hinzufügen -> Vorhandenes Element
  • Browsen Sie zu Grammatik-Projekt \ obj \ Debug und wählen Sie alle generierten Parser-Dateien.
  • Dieser nächste Schritt ist wichtig. Auf der Schaltfläche Hinzufügen gibt es einen kleinen Dropdown-Pfeil. Klicken Sie auf den Dropdown-Pfeil und dann auf "Als Verknüpfung hinzufügen".
  • Dadurch werden die generierten Dateien mithilfe einer symbolischen Verknüpfung anstelle einer direkten Kopie zum Implementierungsprojekt hinzugefügt.
  • Dies bietet den zusätzlichen Vorteil, dass Sie die Parser-Dateien nicht entfernen und neu hinzufügen müssen, wenn Sie später Ihre Grammatik ändern müssen.
  • Sobald Sie so weit gekommen sind, dann können Sie von GrammarProject.CalculatorBaseListener oder GrammarProject.CalculatorBaseParser erben je nachdem, welche Entwicklung Muster, das Sie verwenden entschieden haben.
  • Als eine Randnotiz, "The Definitive ANTLR 4 Reference" von Terence Parr ist eine hervorragende Ressource zu verstehen, wie ANTLR4 funktioniert und die Differenz Entwicklungsmuster. Alle Beispiele sind in Java, aber die Konzepte gelten sowohl für Java als auch für C#.

    +1

    Gibt es ein Update für Visual Studio 2015? Ich war bisher nicht in der Lage, den ANTLR Language Support für 2015 zu installieren und war auch nicht erfolgreich bei der manuellen Umsetzung (die Projektdokumentation führt Sie durch eine frühere Version, die ich 2015 nicht nutzen kann)) – Brandon

    +0

    Ausgezeichnet. Habe es auf VS2015 funktioniert. –

    +0

    Wie man Grammatik zusammensetzt? Ich kompiliere das Projekt, aber es gibt keine CS-Dateien in Obj-Verzeichnis. – Exerion

    0

    hier sind eine Probe von 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); 
        } 
    }