非常に限定された特別なサーバー側スクリプト言語をサポートする必要がある、非常に基本的な Web サーバーを作成しています。基本的にサポートする必要があるのは、「エコー」、オペランドが 2 つだけの加算/減算/乗算 (除算なし)、日付を出力する単純な「date()」関数、および文字列を連結するための「&」演算子の使用だけです。
例は次のとおりです。
echo "Here is the date: " & date();
echo "9 x 15 = : & 9*15;
トークンを生成するために必要なコードを調べて作成しましたが、正しいトークンを使用しているかどうかわかりません。
以下のトークンを作成しました。
ECHO - The echo command
WHITESPACE - Any whitespace
STRING - A string inside quotations
DATE - The date() function
CONCAT - the & operator for concatenation
MATH - Any instance of binary operation (5+4, 9*2, 8-2, etc)
TERM - The terminal character (;)
私が特に確信が持てない数学のもの。通常、整数専用のトークンを作成し、次に各演算子用にもトークンを作成する人を見かけますが、私は二項演算のみを許可したいので、トークンを 1 つのトークンにグループ化するのが理にかなっていると考えました。すべてを個別に行う場合、「5+4+1」を決して受け入れないようにするために、追加の作業を行う必要があります。
質問 1 は、どのトークンを使用するのが正しい軌道に乗っているかということです。
次の質問は、正しい構文を確保するためにこれらのトークンを次にどうするかということです。私が考えていたアプローチは、基本的に「このトークンを持っていることはわかっています。現在のトークンに基づいて次に許可されるトークンのリストがあります。次のトークンはリストにありますか?」と言うものでした。
それに基づいて、すべてのトークンのリストと、それらの直後に表示するのに有効なトークンのリストを作成しました (簡単にするために空白は含めませんでした)。
ECHO -> STRING|MATH|DATE
STRING -> TERM|CONCAT
MATH -> TERM|CONCAT
DATE -> TERM|CONCAT
CONCAT -> STRING|MATH|DATE
問題は、これを最適に実装する方法がまったくわからないことです。実際には、トークン間にスペースがあることを確認するために、空白も追跡する必要があります。しかし、それは私が一度に 2 つのトークンを先読みしなければならないことを意味し、これはますます威圧的になっています。また、if ブロックの嫌なセクションだけでなく、「有効な次のトークン」を管理する方法もわかりません。スクリプトを実際に実行する前に、有効な構文をチェックする必要がありますか?それとも、すべてを一度に実行して、予期しないトークンに到達したときにエラーをスローする必要がありますか? この単純な例では、すべてが左から右に解析するだけで常に正常に機能し、実際の優先順位規則はありません (MATH を除いて、間違っているように感じても、それが 1 つのトークンにまとめた理由の一部です)。 '
パーサーの作成に関する私の調査では、「accept()」関数と「expect()」関数の作成に関する多くの参照が見られますが、それらが何をすべきか、またはどのように機能するべきかについての明確な説明が見つかりません。 .
これを実装する方法と、最終的に結果の文字列を実際に作成する方法がわからないだけだと思います。
私は正しい方向に向かっていますか?このような単純なものを最適に実装する方法を理解するのに役立つリソースを知っている人はいますか? 手作業で行う必要があり、ANTLR のようなツールは使用できません。
助けてくれてありがとう。