私は(大まかに)再帰的降下パーサー(Scalaのパーサーコンビネータなど)がどのように動作するかを理解していると思います。入力文字列を1つのパーサーで解析し、そのパーサーが入力全体の各 "パーツ"入力文字列のフラグメントからASTを直接生成する低レベルパーサに達するまで再帰的な降下対Lex /解析?
Lexing/Parsingの仕組みを理解していると思います。レクサーを実行して入力全体をフラットリストトークンを取得し、トークンリストを取得してASTを生成するパーサを実行します。
しかし、私は、Lex/Parse戦略がどのようにトークン化するかがトークン化されたトークンによって異なることを理解していません。私はXMLのチャンクを取る場合たとえば、:
"<tag attr='moo' omg='wtf'>attr='moo' omg='wtf'</tag>"
再帰下降パーサはこれを取ると、それを打破することが
"<tag attr='moo' omg='wtf'>attr='moo' omg='wtf'</tag>"
-> "<tag attr='moo' omg='wtf'>"
-> "<tag"
-> "attr='moo'"
-> "attr"
-> "="
-> "moo"
-> "omg='wtf'"
-> "omg"
-> "="
-> "wtf"
-> ">"
-> "attr='moo' omg='wtf'"
-> "</tag>"
と(後続の各インデントは親の文字列の分解を表し) <tag
,attr="moo"
などを個別に解析する小さなパーサーは、XMLタグの表現を構成し、それに属性を追加します。
ただし、シングルステップのLex/Parseはどのように機能しますか? <tag
の後と>
の前の文字列は、別々の属性にトークン化する必要がありますが、>
と</tag>
の間の文字列は、必ずしも必要ではありません。最初の文字列がタグ本体内にあり、2番目の文字列がタグ本体の外側にあることをパーサーが伝える必要はありませんか?
編集:通常レクサーは、「モード」または入力に応じて変化する「状態」の設定を有することになる
レクサーは、「LEFTANGLE IDENT =タグIDENT = attr EQ STRING =ムーIDENT = omg」などのようなものを生成します。 –
@ SK-logic:明確にするために質問を編集しました。私の混乱は、タグ本体の 'attr = 'moo''がある場合です。レクサーはそれを' IDENT = tag'に分解しないで、大きなテキストノードとしてトークン化するだけです。 –
これは、レクサーを使って単一の大きな文字列としてトークン化するものではありません。文字列を解体する必要があります(もちろん、すべての空白を失うことになります)。 –