2011-06-15 35 views
3

比方說,我是樂星紅寶石的方法定義:這是詞法分析器的工作嗎?

def print_greeting(greeting = "hi") 
end 

它是詞法分析器的工作,以保持狀態,併發出相關的令牌,或者它應該是比較愚蠢的?注意在上面的例子中,greeting param的默認值是"hi"。在不同的上下文中,greeting = "hi"是變量賦值,它將greeting設置爲"hi"。詞法分析器是否應該發出通用令牌(如IDENTIFIER EQUALS STRING),還是應該能夠識別上下文併發出類似PARAM_NAME EQUALS STRING的東西?

回答

4

我傾向於使詞法分析器儘可能愚蠢,因此它會發出IDENTIFIER EQUALS STRING標記。在詞法分析的時候,(大部分時間)沒有關於令牌應該代表什麼的信息。在詞法分析器中有這樣的語法規則只會用(非常)複雜的語法規則來對其進行處理。這就是解析器的一部分。

+1

如果沒有上下文敏感性,你如何提取語法,如'新地圖>()'? – Flosculus 2015-10-23 15:52:40

2

我認爲詞法分析器應該是「愚蠢的」,在你的情況下應該返回類似這樣的內容:DEF標識符OPEN_PARENTHESIS標識符等於STRING CLOSE_PARENTHESIS END。 解析器應該做驗證 - 爲什麼分裂職責。

1

不要使用ruby,但要使用編譯器&編程語言設計。

這兩種方式都適用,但在現實生活中,使用變量,參數和保留字的通用標識符更容易(「啞詞法」或「啞掃描程序」)。

稍後,您可以將這些通用標識符「轉換」爲其他標記。有時在你的解析器中。

有時,詞法分析器/掃描儀有一個代碼段,不是解析器,允許做幾件「語義」操作,incduing鑄造通用標識符爲關鍵字,變量類型標識符,等等。您的詞法分析器規則檢測到一個通用標識符標記,但會將另一個標記返回給解析器。

另一個類似的常見情況是當你有一個使用「+」和「 - 」的二元運算符和一元符號運算符的表達式或語言時。

1

詞法分析和解析的區別是任意的。在很多情況下,你根本不需要一個單獨的步驟。也就是說,因爲表現通常是最重要的問題(否則解析將主要是微不足道的任務),那麼您需要決定並可能測量詞法分析期間的其他處理是否合理。沒有普遍的答案。