2013-10-27 34 views
10

我有一個Antlr3語法文件的C#解決方案,我試圖升級到Anltr4。事實證明,語法是容易的部分(它變得更好,大小的三分之一!)。生成解析器原來是一個棘手的部分。Antlr4 C#生成文件的目標和輸出路徑

在舊的解決方案中,我只運行AntlrWorks來更新語法文件更改時的詞法分析器和分析器.cs文件。詞法分析器和解析器直接包含在與語法相同的項目中,因此圍繞解析器的框架可以直接使用它們。我注意到(至少在默認情況下)生成的Parser C#類的輸出路徑位於中間目錄中,例如,在C#中的Antlr4目標。 OBJ \調試。這意味着我不能直接在同一個項目中使用解析器。我是否應該改變輸出路徑,如果我想生成的源可用在我的SLN?我不想在我的sln?

我試圖使一個單獨的項目解析器生成,即包含只有語法文件的項目。當使用Antlr4目標構建該項目時,可以從需要解析器類的項目中引用生成的程序集。然而,如果這個項目包含在解決方案中,我仍然沒有在Visual Studio中獲得任何智能感知,因爲它將智能感知基於加載項目的源文件,所以它仍然不太可用。我能夠正常工作的唯一方法是構建然後卸載解析器項目,並讓其他項目將其作爲程序集文件而不是項目引用。

編輯:

望ANTLR利益名單後,我發現這個線程表明隨着智能感知問題可能是Resharpers故障。如果是這種情況,那麼我的問題是如何在我的解決方案中繼續使用Antlr4和Resharper? https://groups.google.com/forum/#!topic/antlr-discussion/QSuJXphaBDg

回答

4

您遇到ReSharper的已知錯誤。 ANTLR 3和ANTLR 4 C#構建集成是可靠的,並且使用Microsoft長期建立的模式,用於其他語言和代碼生成任務。您的選項是:使用ReSharper的

  • 獲取ReSharper的作者,以解決此功能的缺乏支持

    1. 停止或
    2. 修改ANTLR 4的目標,以解決在ReSharper的限制,這將出臺其他問題可能會或可能不會被您接受。

    選項1肯定是最便宜的,並且最有可能爲您的項目提供可靠的長期支持。

  • +1

    選項零即表示接受它顯示虛假錯誤高亮且沒有智能感知。如果沒有R#,VS實際上是不可用的,所以1)不可悲。如果我可以在每個項目的基礎上關閉R#,那麼我會很好,我已將它帶到了R#論壇,並打算提出JetBrains的支持問題。是否有可能將Antlr目標的輸出路由到源目錄而不是中間目錄?是否需要更改Antlr4目標,或者目標上是否已有屬性? –

    12

    我發現了Resharper的擴展:ReSharper.ExternalCode

    Tip for Antlr:在Resharper中添加obj\Debug - >代碼檢查 - >外部代碼和重新加載解決方案。

    這對我很有用。

    +0

    它真的解決了問題,謝謝! – 101V

    +0

    完美地工作。 – sdds

    +0

    自2014年3月以來沒有更新。Abandonware?無論如何,它支持R#8.2。我在10.0.2 ... – joce

    10

    有一種簡單的方法可以同時獲得Antlr 4和Visual Studio的最佳效果。你有一個單獨的語法項目和實施項目的正確軌道,但你缺少一些步驟。

    按照以下步驟獲得智能感知工作

    • 在Visual Studio中,去工具 - >擴展和更新,並搜索「ANTLR語言支持」由山姆·哈威爾的在線部分。
      • 這會做幾件事:
        • 爲組合語法添加模板。
        • 添加語法高亮
        • 爲文法添加一個MSBuild目標以生成解析器。
    • 在您的解決方案,建立項目結構是這樣的:
      • 解決方案
        • 語法項目
          • ANTLR 4組合語法
        • 實施項目
          • 文件夾中的鏈接,生成的文件
          • 監聽器實現類
    • 編寫和編譯你的語法。
    • 在鏈接到生成文件的文件夾中,右鍵單擊該文件夾並單擊添加 - >現有項目
    • 瀏覽到Grammar Project \ obj \ Debug並選擇所有生成的解析器文件。
    • 下一步很重要。在添加按鈕上有一個下拉箭頭。點擊下拉箭頭,然後點擊「添加爲鏈接」。
      • 這將使用符號鏈接而不是直接複製將生成的文件添加到實施項目。
      • 如果您稍後必須更改語法,則可以不必刪除和重新添加解析器文件就可以獲得額外的好處。
    • Intellisense現在應該適用於您生成的解析器類,並且您不需要 即使禁用ReSharper。