五. 基於Bison設計實現C子集的語法分析器

[待完成...]

前期準備

一個基本的C子集語法分析器應該具備以下特點:

  1. 擁有語法樹,參考以下文法:
<加法運算符>::=   +|-
<乘法運算符>::=   * |/
<關係運算符>::=   <|<=|>|>=|!=|==
<字符>::=   _|a|...|z|A|...|Z
<數字>::=   0|<非零數字>
<非零數字>::=  1|...|9
<字符串>::=   "{<合法字符> }" //字符串中可以出現所有合法的可打印字符集中的字符
<程序>::=  [<常量說明部分>][<變量說明部分>]{<子函數定義部分>}<主函數>
<常量說明部分>::=  const<常量定義>{,<常量定義>};
<常量定義>::=   <標識符>=<整數>
<整數>::=  [+|-]<非零數字>{<數字>}|0
<標識符>::=  <字符>{<字符>|<數字>}
<聲明頭部>::=  int <標識符>
<變量說明部分>::=  <聲明頭部>{,<標識符>};
<子函數定義部分>::=  (<聲明頭部>|void <標識符>)<參數><複合語句>
<複合語句>::= ‘{’[<常量說明部分>][<變量說明部分>]<語句序列>‘}’
<參數>::= ‘(‘<參數表>‘)’
<參數表>::=int<標識符>{,int<標識符>} | <空>
<主函數>::=void main’(‘‘)’<複合語句>
<表達式>::=[+|-]<項>{<加法運算符><項>}
<項>::=<因子>{<乘法運算符><因子>}
<因子>::=<標識符>|’(‘<表達式>‘)’|<整數>|<子函數調用語句>
<語句>::=<條件語句>|<循環語句>|’{‘<語句序列>‘}’|<子函數調用語句>;|
<賦值語句>; | <返回語句>;|<讀語句>;|<寫語句>;|;
<賦值語句>::=  <標識符>=<表達式>
<條件語句>::=   if’(‘<條件>‘)’<語句>[else<語句>]
<條件>::=  <表達式><關係運算符><表達式>|<表達式>
<循環語句>::=   while’(‘<條件>‘)’<語句>
<子函數調用語句>::=  <標識符>‘(‘<值參數表>‘)’
<值參數表>::=  <表達式>{,<表達式>}|<空>
<語句序列>::=  <語句>{<語句>}
<讀語句>::=  scanf’(‘<標識符>‘)’
<寫語句>::=  printf’(‘<字符串>,<表達式 >|<字符串>|<表達式 >‘)’
<返回語句>::=  return [ ‘(‘<表達式>‘)’]
  1. 擁有符號表,能保存語法符號的類型、特徵、屬性等,並進行類型檢查。
    可參考:
    編譯器中的符號表
    C++ Program to implement Symbol Table
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章