2011-02-22 53 views
1

我知道詞法分析器和解析器的典型配置,其中詞法分析器讀取源代碼並生成令牌,然後將其導向解析器,解析器將它們用作語法生成中的終端符號。在一個典型的遞歸下降解析器中,你首先調用一些代表開始非終結符的頂級函數,然後這個函數調用其他的並通過詞法分析器中的標記讀取標記。將詞法分析器與許多解析器結合起來

但是如果我需要兩個不同的解析器在同一個詞法分析器的頂部?

我的意思是,他們都來自同一個地方讀書,因爲我不希望同樣的源多次讀取,也就是說,沒有多遍允許,以避免不必要的詞法分析器重複工作。我只是希望當剛剛生成下一個令牌時,兩個解析器都會同時使用它。

但我可以調用這些分析器一個只有一個頂級函數;不能同時調用兩者:/

是否有某種方式可以在某種類型的步模式下運行這些解析器? 也就是說,當我有一個新的令牌時,我想將它傳遞給這兩個解析器,但只是通過該令牌提前它們,儘可能地更新它們的內部狀態和數據結構,然後返回立即等待另一個令牌。

我從來沒有見過這樣的配置。這樣做有沒有可能建立一個解析器?是否有關於如何在代碼中構造這種解析器的一些材料?有沒有任何名字?

編輯1: 我不希望使用任何解析器生成工具,但寫的代碼我自己,因爲我想學習這種東西是如何工作的內部。

+2

你必須談論一些特定的實現(例如Lex/Yacc);如果你正在實施你自己的,你可以簡單的設計它。那麼你在談論哪個實現? – 2011-02-22 20:53:46

+0

不使用任何解析器生成器。寫我自己的。但是我不知道應該如何構造代碼以使其更好。 – SasQ 2011-02-22 22:10:55

+0

這是什麼問題?讓你的詞法分析器返回一個懶惰列表,並且你的兩個分析器都會使用它。你可以根據需要堆疊儘可能多的解析器和變換器(並且詞法分析器應該與其他解析器不同)。 – 2011-02-22 22:42:52

回答

2

您描述了拉解析器的典型流程。它被調用一次,並且需要控制,直到它的所有輸入被完全解析。解析器自己調用詞法分析器來獲取下一個標記。另一方面,每次新的令牌可用時,都會調用推式解析器。所以你可以爲每個新的標記調用幾個分析器。古典野牛可以在推模式中使用(細節爲there)。 Lemon解析器生成器生成推式解析器。

+0

謝謝。現在我知道至少這個術語。所以我現在感興趣的是push解析器是如何工作的。我沒有使用任何解析器生成器,因爲我想了解其內部工作的技巧。 – SasQ 2011-02-22 22:14:06