簡體   English   中英

如何剖析Antlr語法

[英]How to profile an Antlr grammar

我有一個Antlr語法,目前大約有1200行。 它解析我想要的語言,但是對於至少一種構造而言,即使對於較小的輸入文件,它的速度也令人望而卻步。 對於構造的每個添加元素,執行時間似乎都呈指數增長。

我想知道是否有任何良好的准則來調試/分析此類性能問題。

我已經嘗試過使用VisualVM,並且將這兩個方法的名稱命名為closureCheckingStopState和closure_,但這與找出語法錯誤的方式相距不遠。

JetBrains IDEA插件中有一個Profiler選項

參見: https : //github.com/antlr/intellij-plugin-v4/blob/master/README.md

右鍵單擊任何規則以測試規則,您將獲得用於

  • 解析樹
  • 層次結構
  • 探查器

請參閱下面的示例屏幕截圖。

探查器選項卡中的歧義線有助於查找模糊的解析規則。 如果單擊這樣的紅線,則規則將突出顯示。

個人資料標簽 個人資料標簽

解析樹選項卡 ParseTree選項卡

我依靠兩個主要項目來分析和提高語法的性能。

  1. ANTLRWorks 2的最新版本包括高級配置功能。 當前的限制包括以下內容:

    • 探查器不支持需要自定義CharStreamTokenStream語言(例如,用於預處理輸入)。
    • 探查器不會在詞法分析器或解析器中執行自定義的嵌入式操作,因此您的語法需要能夠產生不依賴於這些操作的解析樹。 標准的詞法分析器命令,例如-> skip-> channel(HIDDEN)不會造成問題。
    • 探查器的輸出是大多數ANTLR用戶不容易理解的數字表, 尤其是在知道您應該對數字做些什么方面。
  2. 我使用的是主要版本分支,其中包括ANTLR 4的參考版本中未提供的許多優化。請注意,這些功能“很少”記錄在案,因為它們迄今為止的唯一目的是支持ANTLRWorks和GoWorks的內部開發。 。 對於大多數語法,此fork的執行效果大致等同於參考版本。 但是,對於某些已知的語法,“優化”版本的執行速度是參考版本的200倍以上。

如果您可以提供語法和特別的輸入,那么我可以運行分析並嘗試解釋結果的關鍵部分。


ANTLRWorks的最新版本通過官方NetBeans更新中心發布。 只需運行“ 工具”→“插件” ,轉到“ 可用插件”並找到ANTLRWorks編輯器

要運行分析器,請使用運行→解釋解析器...命令。 通過選擇“ 窗口”→“解析器調試器控制器”,可以在解析操作后使用結果窗口。

正如Wolfgang Fahl所說,IDEA有一個很棒的插件,但是它當然只顯示解析器收集的信息。

因此,如果您無法使用IDEA,或者例如想要實時進行性能分析,則可以通過編程方式進行,如下所示:

public void parseAndProfile(GmmlSaneParser parser) {
    parser.setProfile(true);

    // do the actual parsing

    ParseInfo parseInfo = parser.getParseInfo();
    ATN atn = parser.getATN();
    for (DecisionInfo di : parseInfo.getDecisionInfo()) {
        DecisionState ds = atn.decisionToState.get(di.decision);
        String ruleName = GmmlParser.ruleNames[ds.ruleIndex];

        System.out.println(ruleName +" -> " + di.toString());
    }
}

如果您已經擁有Android Studio,則可以使用內置的Antlr V4插件來使用Antlr分析器。

鏈接中的教程對我有用http://blog.dgunia.de/2017/10/26/creating-and-testing-an-antlr-parser-with-intellij-idea-or-android-studio/

用於測試的Android Studion版本:2.3.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM