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