資源簡介
使用c語言完成的簡單c0文法編譯器的實現,文法為:
<加法運算符> ::= +|-
1<乘法運算符> ?::= *|/
1<關系運算符> ?::= ?<||>=|!=|==
1<字母> ? ::= _|a|...|z|A|...|Z
1<數字> ? ::= 0|<非零數字>
1<非零數字> ?::= 1|...|9
<字符> ? ?::= ? '<加法運算符>'|'<乘法運算符>'|'<字母>'|'<數字>' //字符不能為空
<字符串> ? ::= ?"{十進制編碼為32,33,35-126的ASCII字符}" //字符串可以為空
<程序> ? ?::= [<常量說明>][<變量說明>]{<有返回值函數定義>|<無返回值函數定義>}<主函數>
1<常量說明> ::= ?const<常量定義>;{ const<常量定義>;}
1<常量定義> ? ::= ? int<標識符>=<整數>{,<標識符>=<整數>}
? ? ? ? ? ? ? ? ? ? ? ? ? ? | char<標識符>=<字符>{,<標識符>=<字符>}
1<無符號整數> ?::= <非零數字>{<數字>} //無符號整數不能有0
1<整數> ? ? ? ?::= [+|-]<無符號整數>|0 //無符號整數屬于整數
1<標識符> ? ?::= ?<字母>{<字母>|<數字>}
<聲明頭部> ? ::= ?int<標識符> |char<標識符>
<變量說明> ?::= <變量定義>;{<變量定義>;}
<變量定義> ?::= <類型標識符>(<標識符>|<標識符>‘[’<無符號整數>‘]’){,<標識符>|<標識符>‘[’<無符號整數>‘]’ }
<常量> ? ::= ?<整數>|<字符>
<類型標識符> ? ? ?::= ?int | char
<有返回值函數定義> ?::= ?<聲明頭部>‘(’<參數>‘)’ ‘{’<復合語句>‘}’
<無返回值函數定義> ?::= void<標識符>‘(’<參數>‘)’‘{’<復合語句>‘}’
1<復合語句> ? ::= ?[<常量說明>][<變量說明>]<語句列>
1<參數> ? ?::= <參數表>
1<參數表> ? ?::= ?<類型標識符><標識符>{,<類型標識符><標識符>}|<空>
1<主函數> ? ?::= void main‘(’‘)’ ‘{’<復合語句>‘}’
1<表達式> ? ?::= [+|-]<項>{<加法運算符><項>}
1<項> ? ? ::= <因子>{<乘法運算符><因子>}
1<因子> ? ?::= <標識符>|<標識符>‘[’<表達式>‘]’|<整數>|<字符>|<有返回值函數調用語句>|‘(’<表達式>‘)’ ?
<有返回值函數調用語句> ::= <標識符>‘(’<值參數表>‘)’
? ? ??
<語句> ? ?::= <條件語句>|<循環語句>| ‘{’<語句列>‘}’|<有返回值函數調用語句>;?
? ? ? ? ? ? ? ? ? ? ? | <無返回值函數調用語句>;|<賦值語句>;|<讀語句>;|<寫語句>;|<空>;|<情況語句>|<返回語句>;
<賦值語句> ? ::= ?<標識符>=<表達式>|<標識符>‘[’<表達式>‘]’=<表達式>
<條件語句> ?::= ?if ‘(’<條件>‘)’<語句>[else<語句>]
<條件> ? ?::= ?<表達式><關系運算符><表達式>|<表達式> //表達式為0條件為假,否則為真
<循環語句> ? ::=??for‘(’<標識符>=<表達式>;<條件>;<標識符>=<標識符>(+|-)<步長>‘)’<語句>
<步長>??? ::=? <非零數字>{<數字>}
<情況語句> ?::= ?switch ‘(’<表達式>‘)’ ‘{’<情況表><缺省>‘}’
<情況表> ? ::= ?<情況子語句>{<情況子語句>}
<情況子語句> ?::= ?case<常量>:<語句>
<缺省> ? ::= ?default : <語句>
<無返回值函數調用語句> ::= <標識符>‘(’<值參數表>‘)’
<值參數表> ? ::= <表達式>{,<表達式>}|<空>
<語句列> ? ::= {<語句>}//出現多次或0次ET
<讀語句> ? ?::= ?scanf ‘(’<標識符>{,<標識符>}‘)’
<寫語句> ? ?::= printf ‘(’ <字符串>,<表達式> ‘)’| printf ‘(’<字符串> ‘)’| printf ‘(’<表達式>‘)’
<返回語句> ? ::= ?return[‘(’<表達式>‘)’]

代碼片段和文件信息
#include
#include
#include ?
#include “error.h“
//常量沒有數組
#define STR_CONST_NUM 500 //字符串表的長度
#define SYMBOL_NUM 200 //符號表長度
#define LMAX 200 //token最大長度
#define? SIZE_RESERVE 13
#define? SIZE_SYMBOL 38
#define FUNC_NUM 100 //聲明的函數個數
#define CODE_LINE_NUM 50 //生成代碼行數
#define CODE_LINE_LEN 50 //生成代碼長度
#define PARA_NUM 10 //限制最多10個參數
#define LOCAL_TABLE_LEN 500 //局部量數量
#define STR_LEN 200 //字符串長度
#define REG_NUM 18
#define RET_INT 1
#define RET_CHAR 2
#define RET_VOID 0
#define SYM_REDEFINITION -1 //符號表中重復
#define SYM_FULL -2
#define GLOBAL 1 //標記全局量
#define LOCAL 0 //標記局部量
#define CODE_LEN 200
#define CASE_NUM 100
#define LOCAL_VAR 1//四元式類型
#define GLOBAL_VAR 2
#define TEMP 3
#define CONSTNUM 4
#define RETURN 5
#define GLOBAL_STR 6
#define ADDR 7
#define BLOCK_NUM 500//基本塊最大個數
#define BG_TABLE_SIZE 300//記錄生成基本塊時的目的地表
#define NODE_SIZE 500 //節點表大小
#define BLOCK_SIZE 500//基本塊內代碼行數
#define START_FLAG 1
#define END_FLAG -1
#define GOTO_J 1//基本塊以跳轉結束
#define GOTO_B 3
#define GOTO_JA 4
#define LABEL 2//基本塊以標簽開始
#define OPT_TIME 5//優化遍數
typedef?enum?{ //保存單詞類型?
CONSTSY?=?0
INTSY
CHARSY
VOIDSY
IFSY
ELSESY
FORSY
SWITCHSY
CASESY
RETURNSY
DEFAULTSY
SCANFSY
PRINTFSY
PLUSSY
MINUSSY
STARSY
DIVISY
LPARSY
RPARSY
SLPARSY
SRPARSY
FLPARSY
FRPARSY
COMMASY
SEMISY
COLONSY
SIGNEDINTSY
UNSIGNEDINTSY
CHARACTERSY
STRSY
LESEQUAL
LESS
LAREQUAL
LARGE
DUALEQUAL
ASSIGNSY
NOTEQUAL
IDSY
GAME_OVER
}types;
const?char?*reserve[SIZE_RESERVE]?=?{ //保留字用于比較
“const“
“int“
“char“
“void“
“if“
“else“
“for“
“switch“
“case“
“return“
“default“
“scanf“
“printf“
};
const?char?*reservedSymbol[SIZE_SYMBOL]?=?{//輸出的時候在表中找對應的字符串
“CONSTSY“
“INTSY“
“CHARSY“
“VOIDSY“
“IFSY“
“ELSESY“
“FORSY“
“SWITCHSY“
“CASESY“
“RETURNSY“
“DEFAULTSY“ //前11個保持一致
“SCANFSY“
“PRINTFSY“
“PLUSSY“ //+
“MINUSSY“ //-
“STARSY“ //*
“DIVISY“ //
“LPARSY“ //(
“RPARSY“ //)
“SLPARSY“ //[
“SRPARSY“ //]
“FLPARSY“ //{
“FRPARSY“ //}
“COMMASY“ //
“SEMISY“ //;
“COLONSY“ //:
“SIGNEDINTSY“//整數
“UNSIGNEDINTSY“
“CHARACTERSY“ //char
“STRSY“ //string
“LESEQUAL“ //<=
“LESS“ //<
“LAREQUAL“ //>=
“LARGE“ //>
“DUALEQUAL“//==
“ASSIGNSY“ //=
“NOTEQUAL“ //!=
“IDSY“
};
typedef?enum?{ //填在符號表里的類型
CONST
VARIABLE
ARRAY
FUNCTION
PARAMETER
}symbolKind;
/*typedef?struct?{
int?op;
int?x;
int?y;
int?z;
}Middle;*/
typedef?struct?{ //結點表
char?name[LMAX];//這里存表的節點名
char?fakecode[CODE_LEN];//保存特殊語句的本體
int?number;
}NodeTable;
NodeTable nodetable[NODE_SIZE];
int node_index?=?0;
typedef?struct?{
int?valid;
int?offset;
char?codename[LMAX];
}Register;
typ
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????2909??2018-01-13?18:58??error.h
?????文件???????93428??2018-01-13?23:34??main.c
- 上一篇:VTK三維球體測量
- 下一篇:活期儲蓄賬目管理數據 結構 課程設計 活期
評論
共有 條評論