复制
收藏
提问
简洁

#include <iostream.h> #include <fstream.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> const long stakmaxsize=6000; int flag; const char keyword[][20]={{'i','n','t'},{'v','o','i','d'},{'i','f'}, {'c','h','a','r'},{'b','o','o','l'},{'b','r','e','a','k'},{'c','a','s','e'}, {'c','a','t','c','h'},{'c','o','n','s','t'},{'f','o','r'},{'e','l','s','e'}, {'c','o','n','t','i','n','u','e'},{'c','l','a','s','s'},{'w','h','i','l','e'}, {'d','o'},{'g','o','t','o'},{'f','l','o','a','t'},{'d','o','u','b','l','e'}, {'l','o','n','g'},{'s','w','i','t','c','h'},{'f','r','i','e','n','d'},{'s','t','a','t','i','c'}, {'p','u','b','l','i','c'},{'p','r','i','v','a','t','e'},{'p','r','o','t','e','c','t','e','d'}, {'r','e','t','u','r','n'},{'i','n','l','i','n','e'},{'t','r','y'},{'s','t','r','u','c','t'}}; char Ischeck[]={' ','\n','+','-','*','(',')','{','}', ';','=','\"',',','&','[',']','!',':','<','>','\'','/'}; bool isCheck(const char& ch) { for(int i=0;i<27;i++) if(ch==Ischeck[i]) return true; return false; } struct stack { char stak[stakmaxsize]; int top;}; void initstak(stack& s) {s.top=-1;} void clearstak(stack& s) {s.top=-1;} void push(stack& s,const char& item) {if(s.top==stakmaxsize-1) { cerr<<"溢出"<<endl; exit(1);} s.top++; s.stak[s.top]=item; } bool isKeyword(stack& s) { for(int i=0;i<29;i++) if(!strcmp(s.stak,keyword[i])) return true; return false; } void printout(stack& s) { if(isKeyword(s)) cout<<"关键字:"<<s.stak<<endl; else cout<<"标识符:"<<s.stak<<endl; } void digitpush(stack& s,const char& item) { if(s.top==stakmaxsize-1) {cerr<<"溢出"<<endl; exit(1);} s.top++; s.stak[s.top]=item; } void Getchar(FILE *fp,char& ch) { ch=fgetc(fp); if(ch=='\n') flag++; } void digitprint(stack& s) {cout<<"数:"<<s.stak<<endl;} void check(char *fname) { FILE *fp; bool watch=false,checked=true; flag=1; if((fp=fopen(fname,"r"))==NULL) {cerr<<"文件"<<"\'"<<fname<<"\'"<<"找不到"<<endl; getchar(); exit(1);} stack a; initstak(a); char ch; Getchar(fp,ch); while(!feof(fp)) {if(ch==' '||ch=='\n') {Getchar(fp,ch); checked=true; continue;} else if(checked && (isalpha(ch)||ch=='_'))//判断是否为字母,是字母返回1,否则返回0,checked查看上次有没有输入错误。 { while(isalnum(ch)||ch=='_')//判断是否是字母和数字的组成,是返回1,否则返回0 { if(isCheck(ch)) break; push(a,ch); Getchar(fp,ch); if(feof(fp)) {push(a,'\0'); printout(a); fclose(fp); getchar(); exit(0); } } if(isCheck(ch)) { push(a,'\0'); printout(a); clearstak(a); } else { cout<<"错误位置"<<flag<<endl; checked=false; clearstak(a); continue; } } else if(isdigit(ch) && checked)//判断是否为数字。是返回1,否则返回0,checked表示检查上次输入有没有错误 { while(isdigit(ch)||ch=='.') {if(ch=='.') watch=true; if(isCheck(ch)) break; digitpush(a,ch); Getchar(fp,ch); if(feof(fp)) {digitprint(a); fclose(fp); getchar(); exit(0);} } if(isCheck(ch)) { if(watch) { cout<<""; watch=false; digitpush(a,'\0'); digitprint(a); clearstak(a); } else { cout<<"整形"; digitpush(a,'\0'); digitprint(a); clearstak(a); } } else { cout<<"错误位置"<<flag<<endl; checked=false; clearstak(a); continue; } } else if(checked) { switch(ch) { case'=': Getchar(fp,ch); if(ch=='=') { cout<<"算符 "<<"=="<<endl; Getchar(fp,ch); checked=true; break;} else { cout<<"算符 "<<"="<<endl; checked=true;break;} case'+': Getchar(fp,ch); if(ch=='=') {cout<<"算符 "<<"+="<<endl; Getchar(fp,ch); checked=true;break;} else if(ch=='+') {cout<<"算符 "<<"++"<<endl; Getchar(fp,ch);checked=true;break;} else {cout<<"算符 "<<"+"<<endl; checked=true;break;} case'*': Getchar(fp,ch); if(ch=='=') {cout<<"算符 "<<"*="<<endl; Getchar(fp,ch);checked=true;break;} else {cout<<"算符 "<<"*"<<endl; checked=true;break;} case'/': cout<<"算符:"<<"/"<<endl; Getchar(fp,ch);checked=true;break; case'-': Getchar(fp,ch); if(ch=='=') {cout<<"算符 "<<"-="<<endl; Getchar(fp,ch);checked=true;break;} else if(ch=='-') {cout<<"算符 "<<"--"<<endl; Getchar(fp,ch); checked=true;break;} else {cout<<"算符 "<<"-"<<endl; checked=true;break;} case'!': Getchar(fp,ch); if(ch=='=') {cout<<"算符 "<<"!="<<endl; Getchar(fp,ch);checked=true;break;} else {cout<<"算符 "<<"!"<<endl; checked=true;break

3月前
全网
文档
学术
百科
知识库
时间不限
自动
回答简洁模式
深入研究一些

根据您提供的代码片段,这是一个用C++编写的词法分析器,用于分析C语言源代码中的词法单元。词法分析是编译过程中的一个重要阶段,它将源代码分解成一个个的词法单元,如关键字、标识符、运算符和界定符等37

代码中定义了一个stack结构体,用于存储词法单元。initstakclearstak函数用于初始化和清空栈。push函数用于将字符压入栈中,isKeyword函数用于判断栈中的字符串是否为C++关键字5printout函数用于输出栈中的词法单元,如果栈中的字符串是关键字,则输出“关键字”,否则输出“标识符”10

digitpush函数用于将数字字符压入栈中,digitprint函数用于输出栈中的数字。Getchar函数用于从文件中读取字符,flag变量用于记录当前读取到的行号。

isCheck函数用于检查字符是否为运算符或界定符,Ischeck数组中包含了所有需要检查的字符。check函数是词法分析器的主要函数,它从文件中读取字符,根据字符的类型调用不同的函数进行处理。

check函数中,首先检查字符是否为空白字符或换行符,如果是,则继续读取下一个字符。如果字符为字母或下划线,表示可能是关键字或标识符,调用push函数将字符压入栈中,并继续读取后续字符,直到遇到非字母数字或下划线的字符。如果栈中的字符串是关键字,则输出“关键字”,否则输出“标识符”。

如果字符为数字,调用digitpush函数将数字字符压入栈中,并继续读取后续字符,直到遇到非数字字符。如果字符为小数点,表示可能是浮点数,继续读取后续字符。如果遇到运算符或界定符,根据字符的类型输出相应的词法单元。

此外,代码中还处理了一些特殊情况,例如连续的加号或减号,以及等于号与运算符的组合等。

总的来说,这个C++词法分析器能够识别C语言源代码中的关键字、标识符、数字、运算符和界定符,并将它们输出为词法单元。它通过读取文件中的字符,调用不同的函数进行处理,最终实现词法分析的功能。12489

你觉得结果怎么样?

以上内容由AI搜集生成,仅供参考

在线客服