资源简介
使用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三维球体测量
- 下一篇:活期储蓄账目管理数据 结构 课程设计 活期
评论
共有 条评论