2011-08-18 59 views
5

當你看一個語言的EBNF描述,你經常看到的整數和實數的定義:數字的識別屬於掃描儀還是解析器?

integer ::= digit digit* // Accepts numbers with a 0 prefix 
real  ::= integer "." integer (('e'|'E') integer)? 

(定義是在飛行中做,我可能已經在他們犯了一個錯誤)。

雖然它們出現在上下文無關的語法中,但數字通常在詞法分析階段被識別出來。它們是否包含在語言定義中以使其更加完整,並且要由實施者認識到他們實際上應該在掃描儀中?

回答

3

許多常見的解析器生成器工具 - 比如ANTLR,Lex/YACC - 將解析分爲兩個階段:首先,輸入字符串被標記。其次,令牌被組合成產品來創建具體的語法樹。

但是,有一些替代技術不需要標記:檢查回溯recursive-descent parsers。對於這樣的解析器,令牌的定義與非令牌類似。 pyparsing是這種解析器的解析器生成器。

兩步技術的優點是它通常會產生更高效的解析器 - 帶有標記,字符串操作少,字符串搜索和回溯。

據「權威ANTLR參考」(特倫斯帕爾)

[詞法分析器和解析器]之間的唯一區別是,分析器識別記號流的語法結構,而詞法分析器識別結構一串字符。

1

語法語法需要完整準確,所以當然它包含有關標識符的精確格式和操作符拼寫的詳細信息。

是的,編譯器工程師決定,但通常它很明顯。你希望詞法分析器能夠有效地處理所有的字符級細節。

還有更長的答案在Is it a Lexer's Job to Parse Numbers and Strings?