我想我大致理解递归下降解析器(例如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