質問

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

トークンが似ていることを読みました 言葉 で解析する準備ができています レクサー. 。言語C、C ++、PASCALなどのトークンを見つけることには問題はありませんが、XMLでは、XMLが存在しないために、XMLでキーワード、名前、リテラル、その他の単語のような文字列があります。 tという言葉!マークアップ(タグ)とインターリーブしている単純なテキストのみです。

これらのタグとプレーンテキストの断片はトークンであると思いました。 [TXT][TAG][TAG][TXT][TAG][TXT][TAG][TAG][TXT].... 。 SGMLはマークアップデリミターの内部にあるものを気にしないため、非常に合理的です <> (まあ、それが見つけたときに特別な処理の指示と定義を認識しています ? また ! 次のキャラクターとして;コメントもそのグループに属し、SGMLトークネイザーはXML/HTML/XHTMLパーサーのベースになる可能性があります。

しかし、その後、私はあることができることに気づきました < 他の構文の一部としてマークアップの内部に詰め込まれているキャラクター:属性値: - < 属性値内の文字(使用する方が良い &lt; そのため)、多くのブラウザーと編集者はそれを扱い、これらを扱います < 属性値の一部として、タグ区切り文字ではありません。

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

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

ここ: http://www.antlr.org/wiki/display/antlr3/parsing+xml
いくつかの種類の異なる技術が使用されています:彼らは扱います <> (そしてまた <//>)独立したトークンとして、およびそれらが使用するタグの内部として GENERIC_ID トークンなど、通常、作業のほとんどをパーサーに移動します。しかし、それらはトークナイザーのコンテキストを変更する必要があります。それらはプレーンテキストで異なるコンテキストを使用し、マークアップは異なります(ただし、最初の発生が発生するため、属性値のコンテキストを忘れていました > レクサーのタグを終了します)。

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

役に立ちましたか?

解決

XMLとHTMLパーサーを構築したので、私は意見を持っています。

一般に、語彙素は認識可能な言語要素でなければなりません。

XMLとHTMLの場合、これらは基本的に対応します

  • Tagbegin、の形のもの u003CNAME
  • の形式のタジェンド >
  • の形のtagclose u003C/NAME>
  • フォームのtagendandclose /> (XMLのみ)
  • の形式の属性 名前
  • 正確にはequalsign =
  • 引用符(または、レガシーHTMLの場合)に関係なく、属性によって表される正確な文字文字列の値であると考えられます。属性内に逃げられた文字コードがある場合、それらのコードは実際の文字コードに変換する必要があります。
  • コンテンツ。これは、TagendsとTagbeginsの間のテキストです。帰属と同様に、逃げた文字は変換する必要があるため、間のコンテンツは u003CB>foo <baru003C/b> テキストに変換されます fooエンティティの呼び出しを個別のトークンとして維持したい場合は、それを行うことができ、タグ付けとタグスタートの間にコンテンツとエンティティインボレーショントークンのストリームを生成します。あなたの目標が何であるかに依存します。

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

XMLのDTDとスキーマの合併症を無視した場合、それはあなたが本当に必要とするすべてです。

どのようにlexer 生成 これらはより複雑です。 XMLとHTMLを使用すると、入力ストリームでのエスケープに関係している乱雑さがたくさんあります<[cdata ...]>(私がその権利がある場合)は、コンテンツのlexemeがあるときに奇妙な種類の引用で消滅するだけです生産。これらすべてを処理するには、かなり洗練されたLexerエンジンが必要です。そして、はい、実際の問題として、テキストのさまざまな部分を処理するには、異なる語彙状態(「モード」)が必要です。私は物事を処理するための1つの主要なモードをほとんど持っています <...>, 、およびコンテンツを処理する1つの主要なモード。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top