2010-09-02 141 views
8

我正在閱讀有關編譯器和解析器體系結構,現在我想知道一件事情... 當您有XML,XHTML,HTML或任何基於SGML的語言時,詞法分析器這裏以及代幣是什麼?解析器與詞法分析器和XML

我讀過令牌就像由詞法分析器解析準備。雖然我沒有找到C語言,C++,Pascal等語言的令牌的問題,那裏有關鍵字,名稱,文字和其他由空白分隔的單詞字符串,但是我有一個問題,因爲沒有'無言以對!只有純文本與標記(標記)交錯。

我想我自己可能是這些標籤和純文本片段是令牌,類似的:[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
使用某種不同的技術:他們對待<>(也<//>)作爲分隔標記,他們用GENERIC_ID爲令牌etc.They標籤內通常移動大多數工作到解析器。但他們也必須更改標記器的上下文:他們在純文本中使用不同的上下文,而在標記中使用不同的上下文(但他們忘記了我認爲的屬性值上下文,因爲第一次出現>會在其詞法分析器中結束標記)。

那麼解析SGML類語言的最佳方法是什麼?詞法分析器真的用在那裏嗎?如果是,那麼什麼字符串構成了令牌?

回答

11

已經構建了XML和HTML解析器,我有意見。

Lexemes一般應該是可識別的語言元素。

對於XML和HTML,這些基本上對應於

  • TAGBEGIN,< NAME的形式的東西
  • TAGEND,>
  • TAGCLOSE的形式,所述形式的</NAME>
  • TAGENDANDCLOSE表格/>(XML只)
  • ATTRIBUTENAME,NAME的形式
  • EQUALSIGN的,被精確地=
  • 的AttributeValue,即由一個屬性,表示無論引號的確切字符串的值(或即使沒有報價,對於傳統的HTML)。如果屬性中存在轉義的字符代碼,則應將這些代碼轉換爲其實際的字符代碼。
  • CONTENT,它是TAGEND和TAGBEGIN之間的文本。像ATTRIBUTEVALUES,任何轉義字符應該轉換,所以& LT < B>富之間的內容;禁止</B>轉換爲文本FOO <酒吧 如果您想保留實體調用作爲單獨的令牌,你可以這麼做,在TAGEND和TAGSTART之間產生CONTENT和ENTITYINVOCATION標記流;取決於你的目標是什麼。

我們可以爭論你是否想爲HTML/XML評論產生一個標記。如果你這樣做,你會這樣做。

如果我們忽略DTD和Schema for XML的複雜性,那就是您真正需要的。

詞法分析器如何產生這些比較複雜;使用XML和HTML,在輸入流中存在大量混亂,< [CDATA ...]>(如果我有這個權利),這只是一種有趣的引用,當CONTENT詞位是產生的。要處理所有這些,你需要一個非常複雜的詞法分析引擎。 是的,實際上,您需要不同的詞彙狀態(「模式」)來處理文本的不同部分。我幾乎有一個主要模式來處理內部的東西< ... >,以及一個主要模式來處理內容。

+0

感謝您的快速和實質性的回覆:)
嗯..聽起來很合理。還有3個輔助問題: 1.這意味着'''在'ATTRIBUTEVALUE'標記內遇到時不會被視爲'TAGEND'嗎? 2.這些額外的上下文狀態如何與NFA/DFA理論相關?他們是否被視爲正常狀態?或者一些控制DFA操作的高級國家? 3.使用一個解析器來解析SGML標籤並將它吐出作爲XML/HTML/XHTML解析器的標記在它上面會更好嗎?這是一個明智的做法嗎? – SasQ 2010-09-02 03:25:54

+0

@SasQ:1. 2010-09-02 03:33:29