编译原理课程设计(词法分析,语法分析,语义分析,代码生成)

  • 格式:doc
  • 大小:145.00 KB
  • 文档页数:26

下载文档原格式

  / 26
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#include

#include

#include

using namespace std;

/*********************下面是一些重要数据结构的声明***************************/

struct token//词法token结构体

{

int code;//编码

int num;//递增编号

token *next;

};

token *token_head,*token_tail;//token队列

struct str//词法string结构体

{

int num;//编号

string word;//字符串内容

str *next;

};

str *string_head,*string_tail;//string队列

struct ivan//语法产生式结构体

{

char left;//产生式的左部

string right;//产生式的右部

int len;//产生式右部的长度

};

ivan css[20];//语法20个产生式

struct pank//语法action表结构体

{

char sr;//移进或归约

int state;//转到的状态编号

};

pank action[46][18];//action表

int go_to[46][11];//语法go_to表

struct ike//语法分析栈结构体,双链

{

ike *pre;

int num;//状态

int word;//符号编码

ike *next;

};

ike *stack_head,*stack_tail;//分析栈首尾指针

struct L//语义四元式的数据结构

{

int k;

string op;//操作符

string op1;//操作数

string op2;//操作数

string result;//结果

L *next;//语义四元式向后指针

L *Ltrue;//回填true链向前指针

L *Lfalse;//回填false链向前指针

};

L *L_four_head,*L_four_tail,*L_true_head,*L_false_head;//四元式链,true链,false链

struct symb//语义输入时符号表

{

string word;//变量名称

int addr;//变量地址

symb *next;

};

symb *symb_head,*symb_tail;//语义符号链表

/*********************下面是与词法分析相关的一些函数的声明***************************/

void scan();//按字符读取源文件

void cifa_main();//词法分析主程序

int judge(char ch);//判断输入字符的类型

void out1(char ch);//写入token.txt

void out3(char ch,string word);//写入string.txt

void input1(token *temp);//插入结点到队列token

void input3(str *temp);//插入结点到队列string

void output();//输出三个队列的内容

void outfile();//输出三个队列的内容到相应文件中

/*********************下面是与语法分析相关的一些函数的声明***************************/

void yufa_main();//语法分析主程序

void yufa_initialize();//初始化语法分析数据结构

int yufa_SLR1(int a);//语法分析主体部分

int ID1(int a);//给输入字符编号,转化成action表列编号

string ID10(int i);//给输入字符反编号

int ID2(char ch);//给非终结状态编号,转化成go_to表列编号

int ID20(char ch);//给非终结状态编号

char ID21(int j);//给非终结状态反编号

void add(ike *temp);//给ike分析栈链表增加一个结点

void del();//给ike分析栈链表删除一个结点

/*********************下面是与语义分析相关的一些函数的声明***************************/

void yuyi_main(int m);//语义分析主程序

void add_L_four(L *temp);//向四元式链中加一个结点

void add_L_true(L *temp);//向true链中加一个结点

void add_L_false(L *temp);//向false链中加一个结点

void add_symb(symb *temp);//向语义符号表链中加一个结点

void output_yuyi();//输出中间代码四元式和最后符号表

string newop(int m);//把数字变成字符串

string id_numtoname(int num);//把编号转换成相应的变量名

int lookup(string m);//变量声明检查

/*********************下面是一些全局变量的声明***************************/

FILE *fp;//文件指针

int wordcount;//标志符计数

int err;//标志词法分析结果正确或错误

int nl;//读取行数

int yuyi_linshi;//语义临时变量

string E_name,T_name,F_name,M_name,id_name,id1_name,id2_name,errword;//用于归约时名称传递和未声明变量的输出

int id_num,id1_num,id2_num,id_left,id_while,id_then,id_do;//用于记录一些特殊的字符位置信息

/****************************主程序开始**************************/

int main()

{

cout<<"************************"<

cout<<"* 说明:*"<

cout<<"* 第一部分:词法分析*"<

cout<<"* 第二部分:语法分析*"<

cout<<"* 第三部分:语义分析*"<

cout<<"************************"<

cifa_main();//词法

yufa_main();//语法

output_yuyi();//语义

cout<

system("pause");

return(0);

}