あるデータ形式を別のデータ形式に解析するためのレクサーとパーサーを作成しています (一部は演習として)、質問があります。
3 つの異なるデータ型があり、これらのデータ型は区切り文字で識別されるとします。
a|b #このタイプを「セグメント」と呼びます
a~b #この型を「配列」と呼びます
a^b #このタイプを「コンポーネント」と呼びます
次のように混合することもできます。
hey~there|how~are~you
これは、擬似コードで次のようなものに対応します。
[["hey", "there"], ["how", "are", you"]]
と
hey~there^you~guy|hi|hehe
これは以下に対応します:
[[["hey", "there"], ["you", "guy"]], "hi", "hehe"]
ここで私の質問は、すべての文字列と区切り文字が発行される前に、最初にトークンの型を発行できるように、処理しているデータの型を確認するためにレクサーで先を見ますか? それとも、パーサーが取得した区切りトークンによってそれを把握しようとしますか?
例hey~there^you~guy|hi|hehe
:
(segment)
(component)
(array)
(string "hey")
(array_delim "~")
(string "there")
(component_delim "^")
(component)
(array)
(string "you")
(array_delim "~")
(string "guy")
(segment_delim "|")
(string "hi")
(segment_delim "|")
(string "hehe")
対
(string "hey")
(array_delim "~")
(string "there")
(component_delim "^")
(string "you")
(array_delim "~")
(string "guy")
(segment_delim "|")
(string "hi")
(segment_delim "|")
(string "hehe")
最初のケースでは、パーサーはコンポーネントまたは配列が来ることを認識し、事前に正しいデータ構造を作成します。2 番目の例では、後からデータ構造を把握するため、行ったことをさかのぼる必要があります。