我想我大致理解遞歸下降解析器(例如Scala的解析器組合器)的工作原理:用一個解析器解析輸入字符串,解析器爲整個輸入的每個「部分」調用其他較小的解析器,等等直到你到達低級別的分析器,它們直接從輸入字符串的片段生成AST遞歸下降vs Lex/Parse?
我還認爲我理解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是如何工作的? Lexer如何知道<tag
之後和>
之前的字符串必須被標記爲單獨的屬性,而>
和</tag>
之間的字符串不必是?是不是需要解析器告訴它第一個字符串在標籤體內,第二個情況是在標籤體外?
編輯:改變了例子來更清楚
詞法分析器會產生類似於'LEFTANGLE IDENT = tag IDENT = attr EQ STRING = moo IDENT = omg'等的內容 – 2012-02-27 16:01:57
@ SK-logic:編輯該問題以闡明。我的疑惑是,如果標籤主體有attr ='moo''_sideside,那麼詞法分析器怎麼知道不會將它分解爲'IDENT = tag',並將它標記爲一個大文本節點? – 2012-02-27 16:27:13
好吧,我看到了 - 它不會用一個詞法分析器將這些東西標記爲一個單一的大字符串,你必須解構一個字符串回來(當然,要放掉所有的空格)。 – 2012-02-27 16:42:46