5

將解析樹(即具體語法樹)簡化爲抽象語法樹的一般策略是什麼?如何將我的分析樹簡化爲抽象語法樹?

例如,我有以下的語法規則:

statement_list : statement 
       | statement_list statement 

,如果留下一個解析樹,會產生煽動輸出,看起來像

program 
     statement_list 
       statement_list 
         statement 
           definition 
             p_type 
             assignment 
       statement 
         definition 
     statement 
       assign 
         assignment 

如果我串連的孩子每個節點(因爲語句列表在解析後沒有固有含義),我可以實現以下功能

program 
     definition 
       p_type 
       assignment 
     definition 
     assign 
       assignment 

這個效果很好 - 但是,我不知道這樣做的任何「規則」。我應該尋求簡化的具體語法規則嗎?這是感覺的問題,還是存在更機械的過程?

+1

你可以去擠壓「外觀和感覺」,但主要是很多工作。您可以通過刪除可以使用語法重新生成的節點來基本上機械地完成此操作。請參閱http://stackoverflow.com/a/1916687/120163 –

回答

3

這不是「感覺」問題。抽象語法樹依賴於已解析內容的含義(語義),我認爲這些將是規則:

  1. 刪除不添加含義的標記的節點。這些是中間關鍵字(如「then」),分隔符(如逗號)和括號(如括號) 。
  2. 將相同規則中的有意義的代幣(如「if」)提升爲其他代幣的父代。

沒有單一配方。這取決於目標語言中的短語的含義。

+0

我很欣賞答案,但感覺就像你自相矛盾。你說:「這不是'感覺'的問題,」但你的規則取決於語言。如果有一些指標可以實現的話,我會同意這不是一種感覺問題,但按照它的定義,它肯定會有這種感覺。 – sdasdadas

+0

我會承認任何一天的設計(特別是語言設計)是50/50工程/感覺。這有什麼好處? – Apalala

+0

是的,當然,對不起 - 我忘了回到這個問題。謝謝您的幫助。 – sdasdadas