分析樹和語法樹


  編譯器在實際閱讀源程序的時候,首先通過掃描程序執行語法分析(Lexical analysis):它將字符序列收集到稱作記號(token)的有意義單元中,記號同自然語言,如英語中的字詞。

  例如在下面的代碼行中:

  a[index] = 4 + 2

  這個代碼包括了12個非空字符,但只有8個記號:

  

  每一個記號均由一個或多個字符組成,在進一步處理之前它已被收集在一個單元中。

  

  語法分析程序從掃描程序中獲取記號形式的源代碼,並定義程序結構的語法分析(syntax analysis),這與自然語言中句子的語法分析類似。語法分析定義了程序的結構元素極其關系。通常將語法分析的結果表示為分析樹(parse tree)或語法樹(syntax tree)。

  例如:還是那行C代碼,它表示一個稱為表達式的結構元素,該表達式是一個由左邊為下標表達式、右邊為整型表達式的賦值表達式組成。這個結構可按下面的形式表示為一個分析樹:

  

  請注意,分析樹的內部節點均由其表示的結構名標示出,而分析樹的葉子則表示輸入中的記號序列(結構名以不同字體表示以示與記號的區別)。

  分析樹對於顯示程序的語法或程序元素很有幫助,但是對於表示該結構卻顯得力不從心了。分析程序更趨向於生成語法樹,語法樹是分析樹中所包含信息的濃縮(有時因為語法樹表示從分析樹中的進一步抽取,所以也被稱為抽象的語法樹(abstract syntax tree))。下面是C賦值語句的抽象語法樹的例子:

  

 

  ps: 昨天看到這個,本來想立刻記錄下來的,因為種種別的事情,耽誤了。o(︶︿︶)o 唉,只有今天來做了。

    我本想找一個現成的介紹之類的轉載過來,這樣能夠省不少力氣。

    可是,沒有合適的。

    以上均是我的手打,半個多小時啊~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM