资源简介

这是编译原理语义分析程序 c++实现,运用优先表的方法实现,简单,实用

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
using namespace std;
/*在输出文件save.txt中,相应数字意义如下
关键字--1
标示符--2
数字--3
界限符--4
运算符--5
错误--0
*/
void alpha(ifstream & infileofstream & outfilechar s);
int punct(ifstream & infileofstream & outfilechar sbool nocout);
void digit(ifstream & infileofstream & outfilechar s);
void cifa();

int cmpoper(string astring b);
int main()
{
cifa();

system(“pause“);
return 0;
}

void cifa()//此法分析子程序
{
ifstream infile;
ofstream outfile;
char s;
infile.open(“biaodashi.txt“);
outfile.open(“save.txt“ofstream::out);
while(!infile.eof())
{
infile.read(&ssizeof(char));
if(infile.eof())break;
while(isspace(s))//是空格就读下一个
infile.read(&ssizeof(char));
if(isalpha(s) || s==‘_‘) alpha(infileoutfiles);//是字母就调用关键字或标识符子程序
else if(isdigit(s)) digit(infileoutfiles);//是数字就调用数字分析子程序
else if(ispunct(s)) punct(infileoutfiles0);//是符号就调用界限符或运算符子程序
else {cout< }
infile.close();
outfile.close();
}


void alpha(ifstream & infileofstream & outfilechar s)
{
char buff[40];
int i=0;
bool label=truenocout=true;
char * key[]={“include““iostream““using““namespace““std““int““main““cout““return“};
int n=9;
while( !isspace(s) )//如果下一个字符不是空格或其他符号就把字母或数字或下划线读入数字储存起来
{
if(punct(infileoutfilesnocout)==0 || punct(infileoutfilesnocout)==1) {infile.seekg(-1ios_base::cur);break;}
if( !((s==‘_‘) || (isalpha(s) ) || (isdigit(s) )) ) label=false;
cout< outfile< buff[i]=s;
i=i+1;
infile.read(&ssizeof(char));
}
if(label==false) {cout<<“ wrongA“< else
{//把读取的字符串与关键字比较,判断其是关键字还是标识符
buff[i]=‘\0‘;
for(i=0;i {
if(strcmp(buffkey[i])==0) {cout<<“ 关键字“< else label=false;
}
if(label==false) {cout<<“ 标识符“< }
}

int punct(ifstream & infileofstream & outfilechar sbool nocout)
{//界限符判断
int in=8;
char bound[]={‘“‘‘{‘  ‘}‘  ‘‘  ‘;‘  ‘<‘  ‘>‘  ‘\‘‘};
for(i=0;i {
if(s==bound[i])
if (nocout) return 0;
else {cout< }
if(i
else if(i==0)
{
infile.read(&ssizeof(char));//若连着两个‘“‘则输出第二个‘“‘后退出本函数
if(s==‘“‘) {cout< else infile.seekg(-1ios_base::cur);

while((!infile.eof()))//判断字符串
{
infile.read(&ssizeof(char));
if(s!=‘“‘) cout< else 
{
cout<<“ 字符串“< outfile<<“ 6“< break;
}
}
cout< outfile< }
//运算符判断
int m=9;
char operat[]={ ‘=‘  ‘+‘  ‘-‘  ‘*‘  ‘/‘  ‘#‘  ‘(‘  ‘)‘ ‘.‘};
for(i=0;i {
if(s==operat[i])
if (nocout) return 1;
else {cout< }

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件         22  2009-05-20 15:52  taoeryuyi60\biaodashi.txt

     文件        201  2009-05-18 10:14  taoeryuyi60\compile.txt

     文件     585781  2009-06-15 21:08  taoeryuyi60\Debug\taoeryuyi60.exe

     文件     843944  2009-06-15 21:08  taoeryuyi60\Debug\taoeryuyi60.ilk

     文件    2547872  2009-06-15 21:08  taoeryuyi60\Debug\taoeryuyi60.pch

     文件    1197056  2009-06-15 21:08  taoeryuyi60\Debug\taoeryuyi60.pdb

     文件     132096  2009-06-15 21:08  taoeryuyi60\Debug\vc60.idb

     文件     118784  2009-06-15 21:08  taoeryuyi60\Debug\vc60.pdb

     文件     297266  2009-06-15 21:08  taoeryuyi60\Debug\yuyi.obj

     文件        110  2009-06-15 21:08  taoeryuyi60\save.txt

     文件       4337  2009-05-20 15:21  taoeryuyi60\taoeryuyi60.dsp

     文件        530  2009-05-20 14:45  taoeryuyi60\taoeryuyi60.dsw

     文件      50176  2009-06-15 21:08  taoeryuyi60\taoeryuyi60.ncb

     文件      53760  2009-06-15 21:08  taoeryuyi60\taoeryuyi60.opt

     文件        903  2009-06-15 21:08  taoeryuyi60\taoeryuyi60.plg

     文件       3923  2009-06-16 16:31  taoeryuyi60\yuyi.cpp

     文件         15  2009-06-15 21:08  taoeryuyi60\yuyi.txt

     文件      28672  2009-06-24 00:47  编译课设_FINAL_报告\任务书.doc

     文件     401408  2009-06-24 00:47  编译课设_FINAL_报告\编译课程设计报告_刘涛.doc

     文件      98816  2009-06-24 00:48  编译课设_FINAL_报告\课程设计封面.doc

     目录          0  2009-07-04 16:09  taoeryuyi60\Debug

     目录          0  2009-07-04 16:09  taoeryuyi60

     目录          0  2009-07-04 16:09  编译课设_FINAL_报告

----------- ---------  ---------- -----  ----

              6365672                    23


评论

共有 条评论