📄 parser.cpp
字号:
#include <iostream.h>
#include "Parser.h"
int main()
{
Parser();
return 0;
}
void Parser()
{
error_count = 0;
variable_count = 0;
temp_count = 0;
lineOfProc = 0;
lineOfEqu = -1;
curr_addr = 0;
curr_code = 0;
expr_length = 0;
for(int i = 0; i < 30; i++)
curr_name[i] = '\0';
SymbleIn.open("tokenOut.txt", ios::nocreate);
if(SymbleIn.fail())
{
cout << "file symbleOut.txt open failed, maybe it doesn't exist" << endl;
return;
}
EquOut.open("equ.txt");
if(EquOut.fail())
{
cout << "file equ.txt open failed" << endl;
return;
}
cout << "##############################################" << endl;
cout << "#################语法分析器###################" << endl;
cout << "##############################################" << endl;
cout << "正在进行分析任务......" << endl;
GetNextSymble();
if(curr_code == 18) //pogram
{
GetNextSymble();
if(curr_code == 27) //biao zhi fu
{
GetNextSymble();
if(curr_code == 42)
{
GetNextSymble();
}
if(curr_code == 25) //var
{
Statement();
}
if(curr_code == 2) //begin
{
Begin();
if(curr_code == 38) //程序要以.做为结束
return;
else
Error(7);
}
else
{
Error(3);
}
}
else
{
Error(2);
return;
}
}
else
{
Error(1);
return;
}
int index = 0;
while(index < lineOfEqu)
{
Gen_Equ(equ[index].op, equ[index].arg1, equ[index].arg2, equ[index].result);
index++;
}
SymbleIn.close();
EquOut.close();
}
//出错处理函数
void Error(int n)
{
error_count++;
switch(n)
{
case 1:
cout << "ERROR " << error_count << ": 程序第一行缺少关键字program" << endl;
break;
case 2:
cout << "ERROR " << error_count << ": program后缺少程序名" << endl;
break;
case 3:
cout << "ERROR " << error_count << ": 该程序没有任何可执行语句" << endl;
break;
case 4:
cout << "ERROR " << error_count << ": 第" << lineOfProc << "行声明语句有错误" << endl;
break;
case 5:
cout << "ERROR " << error_count << ": 缺少end" << endl;
break;
case 6:
cout << "ERROR " << error_count << ": 第" << lineOfProc << "缺少;" << endl;
break;
case 7:
cout << "ERROR " << error_count << ": 程序要以.做为结尾" << endl;
break;
case 8:
cout << "ERROR " << error_count << ": 第" << lineOfProc << "行语句有错误" << endl;
break;
case 9:
cout << "ERROR " << error_count << ": 第" << lineOfProc << "行if条件语句有误" << endl;
break;
default:
break;
}
}
//取出tokenOut.txt表中下一个待分析的标志符
//存放到全局变量curr_neme,curr_addr,curr_code中
void GetNextSymble()
{
//char ch;
int temp_label;
if(!SymbleIn.eof())
SymbleIn >> temp_label >> curr_name >> curr_addr >> curr_code >> lineOfProc;
else
curr_code = 0;
SymbleIn.get(); //为了取出每行末尾的回车符与换行符
SymbleIn.get();
return;
}
//变量声明语句的分析
//不做特别处理,只是简单检查有无逻辑错误
//并统计变量个数,将其写入symbleOut.txt输出表中
void Statement()
{
GetNextSymble();
while(curr_code != 2) //不为关键字begin
{
if(curr_code == 27) //为标志符
{
variable_count++;
GetNextSymble();
if(curr_code == 37) //,
{
GetNextSymble();
if(curr_code != 27)
Error(4);
}
else
{
if(curr_code == 40) //:
{
GetNextSymble();
if(curr_code == 3 || curr_code == 6 ||
curr_code ==14 || curr_code == 19)
{
GetNextSymble();
if(curr_code != 42)
Error(6);
else
GetNextSymble();
}
else
Error(4);
}
else
Error(4);
}
}
else
{
Error(4);
GetNextSymble();
}
}
}
//开始分析可执行语句,即为begin后的语句
int Begin()
{
//GetNextSymble();
int rtn = Sen_Analysis();
if(curr_code != 10) //与begin配套的end
{
Error(5);
}
else
GetNextSymble();
return rtn;
}
int Sen_Analysis()
{
int rtn = 0;
GetNextSymble();
switch(curr_code)
{
case 27: //标志符,说明是赋值语句
Sen_Assign();
rtn = expr_rtn_addr;
break;
case 12:
rtn = Sen_For(); //for语句
break;
case 13: //if语句
rtn = Sen_If();
break;
case 20: //repeat循环语句
rtn = Sen_Repeat();
break;
case 26: //while循环语句
rtn = Sen_While();
break;
case 10: //若为end,直接退出函数
return 0;
default: //其他语句为错误
Error(8);
break;
}
Sen_Analysis();
return rtn;
}
//四元式入栈
int EquPush(int op, int arg1, int arg2, int result)
{
lineOfEqu++;
equ[lineOfEqu].op = op;
equ[lineOfEqu].arg1 = arg1;
equ[lineOfEqu].arg2 = arg2;
equ[lineOfEqu].result = result;
return lineOfEqu;
}
//回填函数
void BackPatch(int equ_num, int jmp_addr)
{
equ[equ_num].result = jmp_addr;
}
//返回一个临时变量
int New_Temp()
{
return --temp_count;
}
//产生四元式
void Gen_Equ(int op, int arg1, int arg2, int result)
{
switch(op)
{
case 1:
EquOut << "( 0 " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 2:
EquOut << "( + " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 3:
EquOut << "( - " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 4:
EquOut << "( * " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 5:
EquOut << "( / " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 6:
EquOut << "( j " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 7:
EquOut << "( j< " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 8:
EquOut << "( j> " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 9:
EquOut << "( j= " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 10:
EquOut << "( j<= " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 11:
EquOut << "( j>= " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
case 12:
EquOut << "( j<> " << arg1 << " " << arg2 << " " << result << " )" <<endl;
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -