「パフォーマンスが必要です(20Mbの場合)...そこでJavascriptを決定しました」。これらは矛盾しています。
注意深くコーディングされた再帰下降パーサーはかなり高速ですが、多くのコードを作成する必要があります。一般に、LALR(1)パーサー(文法などからBisonによって生成されたもの)は非常に高速で、コーディングが非常に簡単です。(LALRパーサーをマシンコードに直接コンパイルする方法を示すテクニカルペーパーがあります。これらのパーサーは非常に高速ですが、ビルドするには多くのカスタム機械を実装する必要があります)。
最小限の汗で高性能な解析をフラットにしたい場合は、LRStarを検討する必要があります。(私は著者を知っており、非常に尊敬していますが、それ以外の場合はこれを行うことはできません)。これにより、非常に高速なLALRパーサーが生成されます。欠点:文法をLALR互換にする必要があります。他のCプログラムを拡張するのと同じ方法で、Cコードを記述することにより、「ルール」を拡張する必要があります。これはJavaScriptIMHOを作成するよりもそれほど悪くはないように見えますが、ルールははるかに高速に実行される可能性が高く、これを検討している規模ではこれが重要になります。
GLR解析は、簿記が多いため、LALRよりも必然的に遅くなります。しかし、それは一定の要因にすぎません。これは、LRStarのような高性能エンジンよりも重要な場合があります(たとえば、100倍)。文法を形にするのははるかに簡単であり、文法が複雑でないほどカスタムルールを作成しやすくなるため、問題を起こす価値があるかもしれません。本当に数百万行のコードがある場合、これらのパーサーはせいぜい中速になります。
PEGは基本的にバックトラックです。それは物事を試して、それらが機能しないときにバックトラックする必要があります。それらは、少なくともバックトラックの量だけLALRパーサーよりも遅くなければなりません。文法の整形の問題もあります。
ただし、少し洗練された何かをしたい場合は、構文解析だけでは不十分であることがわかります。その場合、構文解析を最適化する必要はありません。プログラム分析のためにインフラストラクチャを最適化する必要があります。別の方法については、構文解析後の生活に関する私のエッセイを参照してください
。