私は9つの異なる文法を持っています. 解析しているファイルの txt の最初の行に応じて、これらのいずれかが読み込まれます。
レクサー/パーサーのスポーンを 9 月に派生させることを考えていました。クラスを作成してから、一致するものを取得したらすぐにそれらをインスタンス化します。ただし、それによって速度が低下するかどうかはわかりません。私はいくつかのベンチマークが整っていると思います。
本当に、速度は間違いなくここでの私の目標ですが、これが醜いコードであることはわかっています。
現在、コードは次のようになっています。
sin.mark(0)
site = findsite(txt)
sin.reset()
if ( site == "site1") {
loadlexer1;
loadparser1;
} else if (site == "site2") {
loadlexer2;
loadparser2;
}
.................
} else if (site == "site8") {
loadparser8;
loadparser8;
}
findsite(txt) {
...................
if line.indexOf("site1-identifier") {
site = site1;
} else if(line.indexOf("site2-identifier") {
site = site2;
} else if(line.indexOf("site3-identifier") {
site = site3;
}
.........................
} else if(line.indexOf("site8-identifier") {
site = site8;
}
}
いくつかの説明
1) はい、私は antlr で構築した 9 つの異なる文法を本当に持っているので、それらはすべて独自のレクサー/パーサー obj を持ちます。
2) はい、現時点では文字列を比較しており、明らかに何らかの整数マップに置き換えられます。サイト識別子を 1 つの正規表現にまとめることも検討しましたが、それによって速度が向上するとは思えません。
3) はい、これは疑似コードなので、ここでのセマンティクスにあまりこだわりません..
4) lexer/parser ペアの 1 つのインスタンスを作成できないという点で、kdgregory は正しいです。
コードの見栄えを良くするためのハッシュのアイデアは気に入っていますが、速度が上がるとは思いません。