1

私はSwiftコンパイラ(swiftc -dump-ast)によって生成されたASTダンプを解析するANTLR 4文法に取り組んでいます。アンバランスカッコでハンドル入力

以下の例のSwiftプログラムとそれぞれのASTダンプを参照してください。

残念ながら、bug in the compilerのため、ダンプに不均衡なカッコが含まれることがあります(閉じ括弧がいくつかのツリーノードにありません)。次のようにtreeNodeルールを変更

は、このような破損した出力を解析できます。

treeNode 
    : '(' treeNodeContent ')' 
    | functionParameterListNode 
    | '(' treeNodeContent 
    ; 

は残念ながら、この変更は、構文解析のパフォーマンスを殺します。解析時間は、〜50ms〜70 ... 80sから増加します。

文法にはあいまいさが含まれていますが、ほぼすべての時間がtreeNodeルールで費やされます。プロファイラには、膨大な先読みとDFAキャッシュミス率があります。この問題はoccuresいるノードの具体的な種類を特定し、唯一のものに修正を適用する

は私が(まだ十分ではない良い良いですが、)〜50年代の時間を解析しました。

complete grammarexample program:およびそのAST dumpです。

質問:パフォーマンスに影響しない不均衡なかっこを処理する別の方法がありますか?

+0

生成して、デバッグ出力を解析あなたがするSourceKitを使用することができたときに、(ASTダンプが何であるかである)、特に信頼できないデバッグ出力は、次善のようですASTを直接検査して、再解析を避ける。 JSONを生成できると思われる[SourceKitten](https://github.com/jpsim/SourceKitten)を見ましたか? – rici

答えて

1

左ファクタリングは、それを固定で私の最初の試みのようになります。

treeNode 
    : '(' treeNodeContent ')'? 
    | functionParameterListNode 
    ; 
+0

残念ながら、結果は同じです。 –

関連する問題