2017-09-13 135 views
0

在解析過程中/解析之前,是否存在對詞法分析(詞法分析器)的目的或清楚的最佳使用實踐的正式定義?詞法分析器應該完成哪部分解析?

我知道詞法分析器的目的是將字符流轉換爲令牌流,但是在某些(上下文無關的)語言中不可能發生「令牌」的預期概念可能取決於上下文,如果沒有完整的解析,「令牌」很難識別?

使用詞法分析器將每個輸入字符轉換爲令牌並讓解析器完成剩下的工作似乎沒有什麼明顯的錯誤。但是,如果有一個詞法分析器可以接受,例如,在「一元減法」和通常的二進制減法之間進行區分,而不是將其留給解析器?

在決定詞法分析器應該做什麼以及解析器應該做什麼時,是否有任何準確的規則要遵循?

+0

如何對這條規則:「一個詞法分析器必須線性時間和數空間的工作」? – Alexey

+0

另一個可能的規則:「一個詞法分析器消除源代碼格式」 ...... – Alexey

回答

1

是否存在[詞法分析器]的目的的正式定義?

不是。詞法分析器是實際編程世界的一部分,對此正式模型是有用的,但不是確定性的。一個聲稱做某事的程序當然應該做那件事,但是「詞法分析我的編程語言」並不是一個足夠精確的需求陳述。

…或明確的最佳使用做法

如上所述,詞法分析器應該按照它的意圖去做。它也不應該試圖做其他事情。應避免代碼重複。理想情況下,代碼應該是可驗證的。

這些最佳實踐激發了一個成熟的文檔良好的掃描程序框架的使用,該框架的輸入語言翻譯爲要分析的詞法語法的描述。但是,基於特定編程語言特性的實際考慮通常會導致與這種理想的偏差。

有一個詞法分析器可以將每個輸入字符轉換成一個令牌似乎沒有什麼明顯的錯誤,

在這種情況下,詞法分析器將是多餘的;解析器可以簡單地使用輸入流。這被稱爲「無掃描儀解析」,它有其倡導者。我不是其中之一,所以我不會討論利弊。如果你有興趣,你可以從Wikipedia article開始,並按照其鏈接。如果這種風格適合你的問題領域,那就去做吧。

在某些(上下文無關)語言中,不可能發生這樣的情況:「令牌」的預期概念可能依賴於上下文嗎?

當然。一個典型的例子是在EcmaScript正則表達式「文字」中找到的,它需要用完全不同的掃描儀進行詞法分析。 EcmaScript 6還定義了需要單獨掃描環境的字符串模板文字。這可以激發無掃描處理,但它也可以用帶詞彙反饋的LR(1)解析器來實現,其中特定標記非終端的縮小動作導致切換到不同的掃描器。

但是,如果讓一個詞法分析器區分(例如,「一元減法」和通常的二進制減法之間),而不是將其留給解析器,是否可以接受?

任何東西都可以接受,但這個特殊的例子讓我覺得不是特別有用。 LR(甚至LL)表達式解析器不需要任何詞法掃描程序的幫助來顯示減號的上下文。 (樸素運算符優先級語法確實需要這樣的幫助,但更深思熟慮的運算PREC架構不會。但是,LALR解析器生成的存在或多或少地避免了對運算PREC解析器的需要。)

一般發言,對詞法分析器能夠識別語法情況下,它需要複製解析器所做的分析,從而違反了代碼開發的基本最佳實踐(「不重複的功能」)之一。儘管如此,它可能偶爾有用,所以我不會主張絕對禁止。例如,對於YACC /野牛狀生產規則許多解析器補償這樣一個事實:幼稚語法是LALR(2)由專門標記ID的令牌被緊跟一個冒號。

又如,再次從EcmaScript的拉伸,是自動的分號插入(ASI),其可以使用查找表,其鍵是連續的令牌的2元組來完成的高效處理。同樣,Python的空白感知語法可以方便地通過詞法掃描程序的幫助來處理,這些掃描程序必須能夠理解縮進是否相關(例如,不在括號或大括號內)。

+0

「那個特定的例子令我尤其不有用」(對「一元減」) - IMO有作爲「一元減」沒有這樣的事,對我來說' - 5'是'0速記符號 - 5',但許多人認爲,有「一元減」,這是從通常的二元減去不同,它的情況並不少見學生的工作表現看樣'1 - -2'。如果我們承認有兩個不同的運營商,由於某種原因由不同的運營商用同一個符號表示,那麼IMO就是不同的令牌,如果「令牌」希望是有意義的。 – Alexey

+0

能給我一些參考,請爲最佳常見斷詞的做法,喜歡什麼類型的或令牌類常用?例如,我遇到了'id'令牌的使用,但還沒有弄清楚它們是什麼。 – Alexey

+0

'......如果「令牌」希望成爲有意義的東西「:不需要令牌具有唯一的含義。只需要將構成令牌的輸入字符序列與其他字符序列區分開來。最佳做法幾乎總是將它留給解析器以將語義分配給令牌。作爲例子,考慮C語句'a:a.a = 42;'。第一個'a'是一個標籤;第二個是變量名稱;第三個是聚合類型成員的名稱。詞法分析器可能不在乎。所有是標識符。 – rici