パーサーを作成していて、Scanner::NextToken (たとえば) によって返された現在のトークンが小さな値のセット (たとえば、5 ~ 10 個のアイテム; 数個または数個) の 1 つであるかどうかを確認する必要があるとします。
この小さなオープン ソース プロジェクト (https://github.com/gsscoder/exprengine) では、Parser クラス内で、Array::Contains() でクエリを実行するさまざまな静的配列を宣言しました (Parser::Ensure() メソッドを参照)。 )。
チェックトークンのスキャナーで使用されているのと同じ手法を使用してパフォーマンスを向上できるかどうかを推測しています。これは、if ステートメントを使用するヘルパーメソッドです (次のように)。
private static bool IsLineTerminator(int c)
{
return c == 0x0A || c == 0x0D || c == 0x2028 || c == 0x2029;
}
それとも、スキャナーでも、パーサーで使用されている手法を使用する必要がありますか?
任意の意見 (やる気のあるもの) を歓迎します。ANTLR などのツールを使用してパーサー/スキャナーを生成することを提案しないでください。手書きの実装を維持したいと考えています。
よろしく、 ジャコモ