1

あるデータ形式を別のデータ形式に解析するためのレクサーとパーサーを作成しています (一部は演習として)、質問があります。

3 つの異なるデータ型があり、これらのデータ型は区切り文字で識別されるとします。

  1. a|b #このタイプを「セグメント」と呼びます

  2. a~b #この型を「配列」と呼びます

  3. 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 番目の例では、後からデータ構造を把握するため、行ったことをさかのぼる必要があります。

4

1 に答える 1

1

2番目の例は本当にあなたが使いたいものだと思います。その外観から、構文には次の優先順位があります。

segments = 0
components = 1
array = 2

これを念頭に置いて、演算子優先順位パーサーを実装できます。トークンは次のように処理されます。

shift (string "hey")
shift (array_delim "~")
shift (string "there")
reduce array1
shift array1
shift (component_delim "^") 
shift (string "you")
shift (array_delim "~")
shift  (string "guy")
reduce array2
reduce component1 
shift component1 
shift (segment_delim "|")
shift (string "hi")
reduce segment1 
shift segment1 
shift (segment_delim "|") 
shift (string "hehe")
reduce segment2
done

これにより、このような解析ツリーが作成されます。

segment
    segment
        component
            array
                string(hey)
                string(there)
            array
                string(you)
                string(guy)
        string(hi)
    string(hehe) 
于 2013-01-20T05:31:10.457 に答える