9

私は現在、コンパイラとパーサーのアーキテクチャについて読んでいますが、1 つのことについて疑問に思っています... XML、XHTML、HTML、または SGML ベースの言語を使用している場合、ここでのレクサーの役割とトークンは何でしょうか?

トークンは、 lexerによる解析用に準備された単語のようなものだと読んだことがあります。キーワード、名前、リテラル、その他の単語のような文字列が空白で区切られている C、C++、Pascal などの言語のトークンを見つけることに問題はありませんが、XML では問題があります。どんな言葉でも!これは、マークアップ (タグ) がインターリーブされたプレーン テキストのみです。

これらのタグとプレーンテキストの断片がトークンである可能性があると思いました[TXT][TAG][TAG][TXT][TAG][TXT][TAG][TAG][TXT]...。SGML はマークアップ区切り文字の内部にあるものを気にせず<(>まあ、それが見つかったとき、?または!次の文字として特別な処理命令と定義を認識します。コメントもそのグループに属します)、SGML トークナイザーはXML/HTML/XHTML パーサーのベースになります。

しかし、その後、他の構文の一部としてマークアップ内に文字が詰め込まれる可能性があることに気付きました<:エディターはそれを処理し、これらをタグ区切り文字ではなく、属性値の一部として扱います。<&lt;<

レクサーの単純な決定論的有限オートマトン (DFA) によってそのようなマークアップを認識する方法が見当たらないため、少し複雑になります。オートマトンがタグ内にある場合は別のコンテキストが必要であり、属性値に遭遇した場合は別のコンテキストが必要なようです。これには状態/コンテキストのスタックが必要になると思うので、DFA はそれを処理しない可能性があります。私は正しいですか?

あなたの見解は?タグ(マークアップ)とプレーンテキストからトークンを作るのは良いですか?

ここ: http://www.antlr.org/wiki/display/ANTLR3/Parsing+XML
は、ある種の異なる手法を使用しています: それらは<and >(および and も</)/>を個別のトークンとして扱い、タグ内ではGENERIC_IDトークンとして使用します。 .通常、ほとんどの作業をパーサーに移します。しかし、トークナイザーのコンテキストも変更する必要があります。プレーンテキストでは異なるコンテキストを使用し、マークアップでは異なるコンテキストを使用します (しかし、属性値のコンテキストを忘れていたと思います>

では、SGML に似た言語を解析するための最良のアプローチは何でしょうか? レクサーは本当にそこで使われていますか?はいの場合、どの文字列がトークンを構成していますか?

4

1 に答える 1

13

XML パーサーと HTML パーサーを作成したので、意見があります。

一般に、語彙素は認識可能な言語要素である必要があります。

XML と HTML の場合、これらは基本的に

  • TAGBEGIN、<NAMEの形のもの
  • >の形式のTAGEND
  • </NAME>の形式の TAGCLOSE
  • />形式の TAGENDANDCLOSE (XML のみ)
  • NAMEの形式の ATTRIBUTENAME
  • EQUALSIGN、正確には=
  • ATTRIBUTEVALUE は、引用符に関係なく (レガシー HTML の場合は引用符がなくても)、属性によって表される正確な文字列の値です。属性内にエスケープされた文字コードがある場合、それらのコードは実際の文字コードに変換する必要があります。
  • TAGEND と TAGBEGIN の間のテキストである CONTENT。ATTRIBUTEVALUES と同様に、エスケープ文字はすべて変換する必要があるため、 <B>foo<bar</B>の間の CONTENTはテキストfoo<barに変換され ますTAGEND と TAGSTART の間の CONTENT および ENTITYINVOCATION トークンのストリーム。あなたの目標が何であるかによって異なります。

HTML/XML コメントのトークンを生成するかどうかについて議論することができます。もしそうなら、あなたはそうします。

XML の DTD とスキーマの複雑さを無視すれば、本当に必要なのはそれだけです。

レクサーがこれらを生成する方法はより複雑です。XML と HTML では、入力ストリーム内のエスケープに関係する多くの混乱があります <[CDATA ... ]> (私がその権利を持っている場合) は、面白い種類の引用であり、CONTENT 語彙素が生産された。これらすべてを処理するには、非常に洗練されたレクサー エンジンが必要です。はい、実際問題として、テキストのさまざまな部分を処理するには、さまざまな字句状態 (「モード」) が必要です。< ... >内のものを処理するための 1 つのメジャー モードと、CONTENT を処理するための 1 つのメジャー モードがあります。

于 2010-09-02T02:35:22.903 に答える