2017-11-05 12 views
0

ここでOPがANTLTR文法をプロファイルする方法を尋ねるthis questionが見つかりました。
しかし、答えが多少不満足なのは、アクションのない文法に限定されているからです。さらに重要なのは、生成されたlexer/parserのdefaulコンストラクタを使用する自動プロファイリングです。Profile Antlr文法

私は文法をプロファイルする必要があります。つまり、にアクションが含まれており、カスタムコンストラクタを使用して構築する必要があります。したがって、私はレクサー+パーサーを自分自身でインスタンス化し、プロファイルする必要があります。
このトピックに関する情報は見つかりませんでした。私はIntelliJ用のプロファイラがあることを知っていますが、リンクされた質問の答えに記述されているものと非常によく似ています(多分同じです)。

この特別なニーズで私の文法をどのようにプロファイルできますか?私は派手なGUIは必要ありません。結果をコンソールなどに表示すると、私は満足できます。

私はANTLR文法(自己インスタンス化されたレクサー/パーサー)のプロファイリングを可能にするコードを書く方法について、ツールまたはヒントを探しています。
Btw私のターゲット言語はJavaですので、プロファイラもJavaに含まれている必要があります。

+0

この質問はかなり広範で、ここでは答えが難しいです。代わりに 'Parser.setProfile()'をtrueに設定し、解析実行後に 'Parser.getParseInfo()'から取得したものを調べることで開始できます。 –

+0

申し訳ありませんが、私は試してみたいことがあります...私はそのオプションが存在することを知りませんでした – Raven

+0

それは私が探しているすべての情報をカバーするようです。あなたのコメントの内容を含む答えを書くと(そして、それに対応するルールの名前とdecisionInfoをリンクする方法)、私はそれを私の質問に対する正しい答えとして受け入れます。 – Raven

答えて

1

良いスタートは、Parser.setProfile()をtrueに設定し、解析実行後にParser.getParseInfo()から得たものを調べることです。私はまだプロファイリングの結果で詳細に提供されているものを詳しく見ていませんが、ANTLR4のためのvscode拡張のtodoリストには、文法のプロファイリング情報を提供して改善することができます。

意思決定情報から特定のルールへのヒント:のインデックスであるdecision numberがあります。これで取得できるDecisionStateインスタンスはATNState子孫で、ATNState.ruleIndexを取得できます。ルールのインデックスをパーサーのruleNamesプロパティと組み合わせて使用​​すると、そのルールの名前を見つけることができます。この値は、ルールの列挙型エントリにも使用されます。