要實現對typedef的支持,當詞法分析器識別標識符並返回不同的標記時,您需要查找符號表。這很容易在flex lexer中完成。我正在嘗試使用boost Spirit來構建解析器並在示例中查看,但是他們都沒有在詞法分析器和解析器之間傳遞任何上下文信息。在mini c編譯器教程示例中,最簡單的方法是什麼?如何去添加一個符號表接口來boost :: spirit :: lex的詞法分析器?
回答
這是在Spirit.Lex同樣容易。您只需要在匹配令牌後調用代碼,但在將令牌返回給解析器之前就可以調用代碼。這是詞法分析器的語義動作:
this->self += identifier[ lex::_tokenid = lookup(lex::_val) ];
其中lex::_tokenid
是一個佔位符引用當前令牌的令牌ID,lex::_val
指匹配的令牌值(在這一點上很可能這是指向底層輸入流的iterator_range<>
),並且查找是實現實際查找邏輯的功能(即函數對象,例如phoenix::function
)的懶惰。
我會盡量找一些時間來實施將被添加到精神展示這種技術的一個小例子。
要實現對typedef的支持,當詞法分析器識別標識符並返回不同的標記時,您需要查找符號表。
這不就是把本末倒置?詞法分析器的目的是將文本輸入並將其轉換爲簡單的令牌。這使得解析器更易於指定和處理,因爲它不必處理低級別的事情,比如「這些是浮點數的可能表示」等等。
標識符令牌一個符號的基於語言的映射(即:typedef的)不是一件詞法分析器應該做的。這是在分析階段發生的事情,或者甚至可能是後來的抽象語法樹的後期處理。
或者,換一種說法,有一個很好的理由,爲什麼qi::symbols
是一個解析器對象,而不是一個詞法分析器之一。根本不是詞法分析師的業務來處理這種事情。
無論如何,在我看來,你想要做的是建立一種方式(在解析器)將一個標識符標記映射到一個對象,該對象表示已經typedef'd的類型。解析器似乎是做這種事情的方法。
我現在就試試這個。 – Uday
- 1. boost :: spirit :: lex token如何被識別
- 2. Boost :: Spirit :: Lex;我如何指定標記「||」?
- 3. 如何解析條目後跟分號或換行符(boost :: spirit)?
- 4. lex和yacc - 結合兩個詞法分析器和一個yacc
- 5. Spirit Boost real_p分析器行爲奇怪
- 6. 如何使用qi :: symbols分析器使用no_case來匹配來自spirit詞法分析器的標記?
- 7. 如何使用boost :: spirit將一個單詞序列解析成一個向量?
- 8. boost-spirit-lex構建給令牌一個字符串名稱的方式?
- 9. 解析器或詞法分析器是否生成符號表?
- 10. 用boost spirit x3解析一個數字到一個字符串
- 11. 如何在boost :: spirit :: qi分析器中使用多態屬性?
- 12. 如何使用boost :: spirit :: lex實現include指令?
- 13. 將語義動作添加到Boost Spirit分析器時編譯時出錯
- 14. Twig詞法分析器:添加分隔符
- 15. 用boost :: spirit解析帶引號的字符串
- 16. 如何將boost :: spirit :: lex標記的值從iterator_range轉換爲字符串?
- 17. 如何用boost :: spirit :: qi解析行尾?
- 18. 數學解析器/詞法分析器 - 令牌接口設計
- 19. Boost Spirit可選解析器和回溯
- 20. 用Boost :: Spirit(V2.4)解析爲容器
- 21. 詞法分析器
- 22. 使用boost :: spirit解析Newick語法
- 23. 用boost :: spirit解析python語法 - 問題
- 24. 用boost-spirit解析超過15個字符的字符串
- 25. 使用Boost :: Spirit解析轉義字符串:: Spirit
- 26. C++,boost :: spirit解析文本
- 27. 用boost :: spirit解析雙精度列表
- 28. boost :: spirit :: qi :: double_和boost :: spirit :: qi :: int_
- 29. 代表詞法分析器
- 30. 「Ad Hoc」詞法分析器
這個例子呢? – Orient