2011-08-10 66 views
4

要實現對typedef的支持,當詞法分析器識別標識符並返回不同的標記時,您需要查找符號表。這很容易在flex lexer中完成。我正在嘗試使用boost Spirit來構建解析器並在示例中查看,但是他們都沒有在詞法分析器和解析器之間傳遞任何上下文信息。在mini c編譯器教程示例中,最簡單的方法是什麼?如何去添加一個符號表接口來boost :: spirit :: lex的詞法分析器?

回答

5

這是在Spirit.Lex同樣容易。您只需要在匹配令牌後調用代碼,但在將令牌返回給解析器之前就可以調用代碼。這是詞法分析器的語義動作:

this->self += identifier[ lex::_tokenid = lookup(lex::_val) ]; 

其中lex::_tokenid是一個佔位符引用當前令牌的令牌ID,lex::_val指匹配的令牌值(在這一點上很可能這是指向底層輸入流的iterator_range<> ),並且查找是實現實際查找邏輯的功能(即函數對象,例如phoenix::function)的懶惰

我會盡量找一些時間來實施將被添加到精神展示這種技術的一個小例子。

+1

這個例子呢? – Orient

1

要實現對typedef的支持,當詞法分析器識別標識符並返回不同的標記時,您需要查找符號表。

這不就是把本末倒置?詞法分析器的目的是將文本輸入並將其轉換爲簡單的令牌。這使得解析器更易於指定和處理,因爲它不必處理低級別的事情,比如「這些是浮點數的可能表示」等等。

標識符令牌一個符號的基於語言的映射(即:typedef的)不是一件詞法分析器應該做的。這是在分析階段發生的事情,或者甚至可能是後來的抽象語法樹的後期處理。

或者,換一種說法,有一個很好的理由,爲什麼qi::symbols是一個解析器對象,而不是一個詞法分析器之一。根本不是詞法分析師的業務來處理這種事情。

無論如何,在我看來,你想要做的是建立一種方式(在解析器)將一個標識符標記映射到一個對象,該對象表示已經typedef'd的類型。解析器似乎是做這種事情的方法。

+0

我現在就試試這個。 – Uday

相關問題