回答
嗯,首先,語法是用於從表達構建解析樹。所以如果你已經有一個分析樹,你不需要語法。
根據解析器的工作量,通過解析表達式生成的結果樹可能已經是抽象語法樹。或者它可能是一個簡單的解析樹,需要第二遍來構建ast。
要從語法和表達式構造分析樹,首先必須將語法轉換爲有效代碼。通常情況下,你將工作分成其將代表表達成標記列表中輸入流,並且解析器這需要憑證清單,並從中構建解析樹\ AST一個標記。
所以表達式1 + 2*(3+4)
可能被分成標記列表如下:
1 - int
+ - add_operator
2 - int
* - mul_operator
(- lparen
3 - int
+ - add_operator
4 - int
) - rparen
第一列是實際的文本值。第二個表示令牌類型。這些令牌被送入分析器,它是從你的語法建成並識別記號,並建立解析樹。
那麼,如何編寫詞法標記器和實際的解析器?您可以手動推出自己的產品。或者更常見的是使用像coco或antlr或lex/yacc這樣的解析器生成器。這些工具會描述您的語法並生成令牌和解析器的代碼。 (代碼生成器對於大多數流行語言都是存在的,一些不受歡迎的語言也存在。)
構建解析器的方式很大程度上取決於您使用的語言。你怎麼會寫在Haskell解析器是你將如何在,說完全不同,C
這裏有一個教程將告訴您如何build your own recursive descent parser。
Coco是各種語言的解析器生成器,其中 附帶有關如何入門的文檔。
如果Python是你的東西,那麼pyparsing也許適合你。
「爲了從語法和表達構建解析樹,你必須先你的語法轉換爲工作代碼」這本身就令人困惑,應該刪除這個答案。這個「答案」的其餘部分並不真正告訴你如何構建一個語法樹;如果作者真的回答了這個問題,它只是在一些可能有用的工具上揮動手。 – 2014-05-24 17:08:14
請指出一些關於如何將語法轉換爲有效代碼的指針 – 2014-10-30 03:06:38
我會從一般的角度回答這個問題,而不是試圖談論詞法分析器和解析器。
解析樹包含非終端符號,它們是上下文無關語法的一部分,並顯示產生鏈以遞歸方式或非遞歸方式獲取由終端符號組成的字符串。所以當你有解析樹時,你不需要語法 - 你可以從解析樹中派生語法。
的AST不包含任何非末端符號。它只包含符號。
例子:
E
|
E + T
| |
T M * M
| | |
M a b
|
a
該圖是a+a*b
的一個非常快速的版本。注意,抽象語法樹的解釋方式取決於樹的優先順序,你做什麼類型的遍歷(按順序,預定順序,後順序)這將是你編碼到你的搜索樹中的一個通用函數。但是,一般來說,該分析樹的AST可能如下所示:
+
| |
a *
| |
a b
- 1. 抽象語法樹構造和遍歷
- 2. 從堆棧創建抽象語法樹
- 3. 遍歷抽象語法樹
- 4. 開發抽象語法樹
- 5. 增強抽象語法樹
- 6. 打印抽象語法樹
- 7. GCC抽象語法樹
- 8. 抽象語法樹問題
- 9. 構建抽象語法樹時需要考慮的要點
- 10. 如何在野牛中顯示語法的抽象語法樹?
- 11. 抽象語法樹與對象模型
- 12. 如何將我的分析樹簡化爲抽象語法樹?
- 13. 編譯器如何構建語法樹?
- 14. Eclipse的抽象語法樹DIFF
- 15. 字符串到抽象語法樹
- 16. F#解析抽象語法樹
- 17. golang - 樹結構抽象
- 18. C++中的抽象語法樹:類與結構
- 19. 我需要幫助來構建XML文件中的AST(抽象語法樹)
- 20. 如何將hive查詢轉換爲抽象語法樹?
- 21. 如何從BNF設計抽象語法樹(AST)
- 22. 如何從ParseResults獲取抽象語法樹
- 23. 如何爲XPath開發AST(抽象語法樹)?
- 24. 如何解釋鏈式比較操作的抽象語法樹?
- 25. 如何在scala中創建抽象語法樹的深層副本?
- 26. 如何創建考慮'|'的抽象語法樹? (簾布層/ Yacc的)
- 27. 解析樹和抽象語法樹有什麼區別?
- 28. 在OCaml中抽象語法樹的S-表達式樹
- 29. 將分析樹轉換爲AST(抽象語法樹)C++
- 30. 命令式語言的抽象語法樹
由HS提供的「答案」令人困惑,而且actualy沒有直接解決問題。這個問題其實這裏有一個答案:http://stackoverflow.com/a/25106688/120163 – 2014-08-03 17:29:29