2013-10-11 144 views
12

我想使用Antlr4解析我的C#應用​​程序中的一些文件。根據我的語法,我已經能夠生成解析器和詞法分析器文件。現在我想使用讀取文件並將解析器和詞法分析器應用於它們。我一直在尋找關於如何做到這一點的文檔,但是我很短。我發現了一些使用舊版Antlr的舊例子,但它們似乎不適用於Antlr4。任何幫助,將不勝感激。謝謝。Antlr4 C#應用程序教程/示例

回答

10

嘗試

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
  • 在Visual Studio中,去工具 - >擴展和更新,並搜索「ANTLR語言支持」由山姆·哈威爾的在線部分。對於合併語法
    • 再添模板:更多信息可以在GitHub project site
      • 這做了幾件事情被發現。
      • 添加語法高亮
      • 爲文法添加一個MSBuild目標以生成解析器。
  • 在您的解決方案,建立項目結構是這樣的:
    • 解決方案
      • GrammarProject
        • Calculator.g4
      • ImplementationProj ECT
        • GeneratedFiles(此文件夾中的所有文件添加鏈接位於GrammarProject文件\ OBJ \調試)
          • CalculatorBaseListener.cs
          • CalculatorBaseVisitor.cs
          • CalculatorLexer.cs
          • CalculatorListener.cs
          • CalculatorParser.cs
          • CalculatorVistor.cs
        • MyCalcualtorImplementation.cs
  • 編寫和編譯你的語法。
  • 在鏈接到生成文件的文件夾中,右鍵單擊該文件夾並單擊添加 - >現有項目
  • 瀏覽到Grammar Project \ obj \ Debug並選擇所有生成的解析器文件。
  • 下一步很重要。在添加按鈕上有一個下拉箭頭。點擊下拉箭頭,然後點擊「添加爲鏈接」。
    • 這將使用符號鏈接而不是直接複製將生成的文件添加到實施項目。
    • 如果您稍後必須更改語法,則可以不必刪除和重新添加解析器文件就可以獲得額外的好處。
  • 一旦你已經遠遠得到這一點,那麼你可以從GrammarProject.CalculatorBaseListener或GrammarProject.CalculatorBaseParser取決於什麼樣的發展模式已決定使用繼承。

作爲附註,Terence Parr的"The Definitive ANTLR 4 Reference"是理解ANTLR4的工作方式和差異開發模式的極好資源。所有的例子都是用java編寫的,但這些概念同時適用於Java和C#。

+1

是否有適用於Visual Studio 2015年更新?到目前爲止,我一直無法在2015年安裝ANTLR語言支持,並且還沒有成功實現它的手動操作方式(該項目的文檔將引導您完成2015年無法工作的先前版本) – Brandon

+0

優秀。得到它在VS2015工作。 –

+0

如何編譯語法?我編譯該項目,但在obj目錄中沒有cs文件。 – Exerion

0

這裏有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); 
    } 
}