• 大小: 4KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-08-20
  • 语言: C/C++
  • 标签: 编译原理  

资源简介

编译原理大作业,C语言小子集编译程序-递归下降分析。本上机实习是为C语言(子集)设计一个编译程序,完成词法分析、语法分析、语义分析等功能,并生成某种机器上的目标代码(汇编语言)或中间代码(四元式)。

资源截图

代码片段和文件信息

#include
using namespace std;

const int max_word = 505;
//关键字 
const char keyWord[13][20] = {“main““if““else““do““while““for““switch“
“case““int““double““float““long““void“};

//单词表 
struct Word{
char value[20];//单词值 
int type;//单词种类
int line;//行号 
}w[max_word]; 

//四元式
struct si_Yuan{
string op;//运算符
string s1;
string s2;
string res;//结果 
}sy[105];
//文件流 
FILE *fin*fout;
int line = 1;
char token[12];//存放单词 
int flag = 0;//判断是否获取字符 
int flag1 = 0flag2;//flag1判断是否项已经产生miss错误; 
int e = 0;//错误个数 
int sy_num = 0;//四元式的个数
string ops1ss1s2resres1res2op2op1; 
int op_num = 0op_num1 = 0;//运算符的个数
int sy_id;//四元式的序号 

string var[300];//已经声明的变量 
int var_num = 0;//声明变量的个数 

int sent_id;//判断ifwhile语句 
string equ[300];//= 
int abc; 
int equ_num = 1; //=个数 
int cnt = 0token_num = 0;//当前字符 
int row = 1;//当前行数 
char ch;
char ch1; 

int word_num = 0;//单词的总个数 
int word_cnt = 0;
string temp;
char str_int[20];
stackword_stack;//保存 
stackop_stack;
//程序 
void S();
void P();//(){分程序} 
void P1();//分程序 
void A();//变量说明部分
void B();//语句部分
void B1();
int C();//变量说明
void D();//标识符表
void D1();
void E();//标识符
void F();//字母 
void G();//数字 
void H();//语句 
void I();//赋值语句 
void J();//条件语句 
void K();//循环语句 
int L();//关系运算符 
void M();//表达式 
void M1();
void N();//项 
void N1();
int O();//加法运算符 
int Q();//乘法运算符 
void R();//常量 
void S();//无符号整数 
void T();//数字序列 
void W();//复合语句 
void X();//条件 
void Y();//语句1 
void Z();//因子
 
//构造四元式 
void siYuan(string opstring s1string s2string res)
{
sy[sy_num].op =op;
sy[sy_num].s1=s1;
sy[sy_num].s2=s2;
sy[sy_num].res=res;
sy_num++;
}

void printFour()//输出四元式 
{
ofstream out(“sy.txt“);
    int i;
    for(i=0;i    {
    cout<    out<    }
}
void error(string err)//报错,定位到错误行 
{
        cout<<“第“< cout< e++;
}

//检查变量是否被声明
void is_say(string a)
{
int i;
    for(i=1;i<=var_num;i++)
    {
     if(a.compare(var[i])==0)
{
break;
}
}
if(i>var_num)  
{
cout<<“第 “< cout< e++;
}
}

void init_token(){
int i;
for(i = 0;i < 12;i++){
token[i] = NULL;
}
}

int judge_token(){
init_token();
if(flag == 0){
ch = getc(fin);
}
flag = 1;
while(ch == ‘ ‘ || ch == ‘\t‘ || ch == ‘\n‘){
if(ch == ‘\n‘){
row++;
}
ch=getc(fin);
}
token_num = 0;
if((ch>=‘a‘ && ch <= ‘z‘) || (ch >= ‘A‘ &&ch <= ‘Z‘)){
//可能为标识符或者变量名 
while((ch>=‘a‘ && ch <= ‘z‘) || (ch >= ‘A‘ &&ch <= ‘Z‘) || (ch >= ‘0‘ && ch <= ‘9‘)){
token[token_num++] = ch;
ch = getc(fin);
}
token[token_num++] = ‘\0‘;
for(int i = 0;i <13;i++){
if(strcmp(t

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件         132  2018-12-31 19:23  compiler.txt
     文件         309  2018-12-31 19:23  sy.txt
     文件       15070  2018-12-31 19:09  编译原理end.cpp

评论

共有 条评论