资源简介
这是我自己写的编译原理赋值语句(语法语义分析)翻译程序其中内含有词法分析程序,经多次测试程序无误。运行的方法是:在“test.txt"文本文档中输入你要测试的赋值表达式例子,其中文本文档中有样例,表达式要以“;”(分号结束)。 "lex.h"为词法分析都文件,最后翻译的结果是以逆波兰式显示在dos中的,其它的一些txt文本中保存着词法分析的结果。希望对大家有所帮助!
代码片段和文件信息
#include
#include
#include
#include
#include
#include
using namespace std;
#include “Lex.h“
int ForecastTable[7][14]={{0000000100 0 0 00}
{0000000200 0 0 0 0}
{3300333330 4 5 0 0}
{14150089710600000}
{181920210000000000}
{161616160000017001717}
{13131313121100013001313}};
string b[]={“+““-““*““/““(““)““=““#“};
int xuNum(string s)
{
for(int i=0;i<8;i++)
{
if(s==b[i])
return i;
}
return -1;
}
int Vntermi(string s)
{
char *Vn[7]={“S““A““B““E““F““T““P“};
for(int i=0;i<7;i++)
{
if(Vn[i]==s)
return i;
}
return -1;
}
int Vtermi(string s)
{
char *Vt[14]={“+““-““*““/““++““--““n““i““(““)““f““t““;““#“}; //
for(int i=0;i<14;i++)
{
if(Vt[i]==s)
return i;
}
return -1;
}
int main()
{
Lex l;
l.Initial();
l.Handle();
stackAnalysis_Stack; //定义的分析栈
Analysis_Stack.push(“#“);
Analysis_Stack.push(“S“);
bool Hefa=true;
l.Limit_Queue.push(“#“);
l.Sequence_Queue.push(5); //#当做界限符处理压力队列,队列里存储着剩余的输入字符串
cout<< Analysis_Stack.size()< cout<
while(Analysis_Stack.size()!=1&&l.Sequence_Queue.size()!=1)
{
//cout<<“yinfei“< string S_Analysis;
S_Analysis=Analysis_Stack.top();
int i_Analysis;
i_Analysis=Vntermi(S_Analysis);
if(i_Analysis==-1) //分析栈里的首元素是终极符,应该匹配
{
if(S_Analysis==“+“||S_Analysis==“-“||S_Analysis==“*“||S_Analysis==“/“||
S_Analysis==“++“||S_Analysis==“--“||S_Analysis==“=“)//终结符为运算符
{
int i_Sequence;
i_Sequence=l.Sequence_Queue.front();//将保存读入字符类型号取出1为关键字;2为标识符
//3为运算符,4为double型的数,5为界限符,6为整数
if(i_Sequence!=3)
{
cout<<“运算符超出定义的范围“< }
else
{
string S_Operator;
S_Operator=l.Operator_Queue.front();//取出运算符队列的首元素与分析栈的首元素比较
if(S_Operator!=S_Analysis) //不相同显示出错
{cout<<“运算符出错“< else //相同则匹配,消去
{
l.Sequence_Queue.pop(); //类型号队列首元素删除
Analysis_Stack.pop(); //分析栈首元素删除
l.Operator_Queue.pop(); //运算符队列首元素删除
}
}
}
else if(S_Analysis==“(“||S_Analysis==“)“||S_Analysis==“;“)//终结符为界限符
{
int i_Sequence;
i_Sequence=l.Sequence_Queue.front();
if(i_Sequence!=5)
{
cout<<“界限符不匹配“< }
else
{
string S_Limit;
S_Limit=l.Limit_Queue.front();//取出界限符队列的首元素与分析栈的首元素比较
if(S_Limit!=S_Analysis) //不相同显示出错
{cout<<“界限符出错“< else //相同则匹配,消去
{
l.Sequence_Queue.pop(); //类型号队列首元素删除
Analysis_Stack.pop(); //分析栈首元素删除
l.Limit_Queue.pop(); //界限符队列首元素删除
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 25 2009-05-21 00:04 赋值语句的翻译\Constant.txt
文件 505841 2009-05-20 23:59 赋值语句的翻译\Debug\Syntax_Semantic.obj
文件 107520 2009-05-21 00:04 赋值语句的翻译\Debug\vc60.idb
文件 159744 2009-05-20 23:59 赋值语句的翻译\Debug\vc60.pdb
文件 651368 2009-05-20 23:59 赋值语句的翻译\Debug\语法语义分析.exe
文件 879376 2009-05-20 23:59 赋值语句的翻译\Debug\语法语义分析.ilk
文件 3296520 2009-05-20 23:37 赋值语句的翻译\Debug\语法语义分析.pch
文件 1238016 2009-05-20 23:59 赋值语句的翻译\Debug\语法语义分析.pdb
文件 0 2009-05-21 00:04 赋值语句的翻译\error.txt
文件 69 2009-05-21 00:04 赋值语句的翻译\Identifier.txt
文件 0 2009-05-21 00:04 赋值语句的翻译\KeyWord.txt
文件 27025 2009-05-20 23:52 赋值语句的翻译\Lex.h
文件 23 2009-05-21 00:04 赋值语句的翻译\LimitSign.txt
文件 75 2009-05-21 00:04 赋值语句的翻译\Operator.txt
文件 9201 2009-05-20 23:59 赋值语句的翻译\Syntax_Semantic.cpp
文件 9 2009-05-20 23:57 赋值语句的翻译\test.txt
文件 4417 2009-05-19 12:30 赋值语句的翻译\语法语义分析.dsp
文件 532 2009-05-19 12:26 赋值语句的翻译\语法语义分析.dsw
文件 66560 2009-05-21 00:05 赋值语句的翻译\语法语义分析.ncb
文件 48640 2009-05-21 00:05 赋值语句的翻译\语法语义分析.opt
文件 922 2009-05-20 23:59 赋值语句的翻译\语法语义分析.plg
目录 0 2009-05-20 23:59 赋值语句的翻译\Debug
目录 0 2009-05-21 00:05 赋值语句的翻译
----------- --------- ---------- ----- ----
6995883 23
- 上一篇:c#制作的简单音乐播放器
- 下一篇:LPC1788 USB驱动例程
评论
共有 条评论