前面那个有点问题,这是改进后的:
#include<iostream>
#include<string>
#include<stack>
#include<cctype>
using namespace std;
double count(double left,char op,double right);
int you(char op);
double chuli(string stra);
stack<double>opnd;
stack<char>optr;
char car; string str="";
double count(double left,char op,double right)
{
double ret;
int reta;
if(op=='+'){
ret=left+right;
return ret;
}
if(op=='-'){
ret=left-right;
return ret;
}
if(op==''){
ret=leftright;
return ret;
}
if(op=='/'){
ret=left/right;
return ret;
}
if(op=='%'){
int lefta,righta;
lefta=(int)left;
righta=(int)right;
reta=lefta%righta;
return reta;
}
if(op=='^'){
int righta=(int)right;
double lefta=left;
if(righta>0){
for(int a=1;a<righta;a++)
lefta=left;}
else if(righta==0)
lefta=1000000;
else{
righta=-righta;
for(int a=1;a<righta;a++)
lefta=left;
lefta=1/lefta;}
return lefta;
}
}
int you(char op)
{
if(op=='(')
return 0;
if(op=='+'||op=='-')
return 1;
if(op==''||op=='/'||op=='%')
return 2;
if(op=='^')
return 3;
}
int main(){
double last;
char choice;
int num1=0;
while(true){
cout<<"请输入你要计算的表达式,并以‘=’号结束:\n";
do{
cin>>car;
if(car!='=')
str+=car;
if(car!='('&&car!=')'&&car!='+'&&car!='-'&&car!=''&&car!='/'&&car!='%'&&car!='^'&&car!='='&&!isdigit(car)&&car!='')
num1++;
if(car=='=')
break;
}while(car!='=');
if(num1==0){
str+="=";
last=chuli(str);
cout<<"你输入的表达式是:"<<str<<endl;
cout<<"运算结果是:"<<last<<endl;}
else{
cout<<"你输入的表达式不符合规则!\n";
num1=0;}
cout<<"'y'继续,'n'退出"<<endl;
cin>>choice;
str="";
if(choice=='n')break;
}
system("pause");
return 0;
}
double chuli(string stra)
{
string strb="";double dou;
for(int a=0;a<stralength();a++){//1
if(isdigit(stra[a])||stra[a]==''){//11
strb+=stra[a];
if(!isdigit(stra[a+1])&&stra[a+1]!=''){//111
dou=atof(strbc_str());
opndpush(dou);
strb="";}//111
}//11
if(stra[a]=='+'|| stra[a]=='-'||stra[a]==''||stra[a]=='/'||stra[a]=='%'||stra[a]=='^'){//12
if(a==0){//121
opndpush(0);
optrpush(str[a]);}//121
else if(stra[a-1]=='('){//124
opndpush(0);
optrpush(str[a]);}//124
else if(optrempty()){
optrpush(stra[a]);
}
else if(you(stra[a])>you(optrtop())){//122
optrpush(stra[a]);
}//122
else if(you(stra[a])<=you(optrtop())){//123
while(!optrempty()&&you(stra[a])<=you(optrtop())&&optrtop()!='('){
double left,right;
right=opndtop();
opndpop();
left=opndtop();
opndpop();
opndpush(count(left,optrtop(),right));
optrpop();}
optrpush(stra[a]);
}//123
}//12
if(stra[a]==')'&&optrtop()=='('){//13
optrpop();
}//13
if(stra[a]==')'&&optrtop()!='('){//16
while(optrtop()!='('){//161
double left,right;
right=opndtop();
opndpop();
left=opndtop();
opndpop();
opndpush(count(left,optrtop(),right));
optrpop();}//161
optrpop();
}//16
if(stra[a]=='('){//14
optrpush('(');
}//14
if(stra[a]=='='){//15
while(!optrempty()){//151
double left,right;
right=opndtop();
opndpop();
left=opndtop();
opndpop();
opndpush(count(left,optrtop(),right));
optrpop();}//151
}//15
}//1
return opndtop();
}
#include <iostream>
using namespace std;
#define m 45
#define n 100
#define t 10
int main()
{
FILE fp;
char filename[20],c[n];
printf("Type the file name which you want to open:");
scanf("%s",&filename);
fp=fopen(filename,"r+"); /以r-只读方式打开指定文件/
if((fp=fopen(filename,"r"))==NULL) /文件不存在输出错误/
{cout<<"文件不存在!"<<endl;exit(-1);}
cout<<"文件中内容如下:"<<endl;
for(int j=0;!feof(fp);j++){
c[j]=fgetc(fp);//从流中读取字符
}
char keyword[m][t]={"include","int","string","cout","cin","auto","break","case","char","class","const",
"continue","default","delete","do","double","else","enum","extern","float","for","friend","if","inline",
"int","long","new","operator","private","protected","public","register","return","short","sizeof","static",
"struct","switch","template","this","typedef","union","virtual","void","while"};//关键字数组
char a[t],p=c,q=a,s=a;
bool w=0,r=0;
int i=0;
for(i=0;i<10;i++)a[i]=NULL;//初始化临时数组
while (p !=NULL){
q=s=a;
if((p>='a'&&p<='z')||(p>='A'&&p<='Z')||p=='_'){//识别标识符
q=p;p++;q++;
while ((p>='a'&&p<='z')||(p>='A'&&p<='Z')||(p>='0'&&p<='9')||p=='_'){
q=p;p++;q++;
}
for(i=0;i<m;i++)if(strcmp(keyword[i],a)==0){r=1;break;}
if(r==1){cout<<"关键字为:";r=0;}
else cout<<"标识符为:";
while(s!=q){
cout<<s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
}
else if(p=='\''){//识别字符常量
p++;
while(p!='\''){
q=p;
p++;
q++;
}
cout<<"字符常量为:";
while(s!=q){
cout<<s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
p++;
}
else if(p=='\"'){//识别字符串常量
p++;
while(p!='\"'){
q=p;
p++;
q++;
}
cout<<"字符串常量为:";
while(s!=q){
cout<<s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
p++;
}
else if(p=='+'||p=='-'||p==''||p=='/'||p=='='||p=='%'||p=='/'){//识别运算符
cout<<"运算符为:"<<p;
cout<<endl;
p++;
}
else if(p==';'||p==','){//识别分解符
cout<<"分界符为:"<<p;
cout<<endl;
p++;
}
else if(p>='0'&&p<='9'){
s=q=a;
q=p;p++;q++;
while(p>='0'&&p<='9'||p==''){
q=p;p++;q++;
}
while(s!=q){
if(s==''){w=1;break;}//识别实型常量
s++;
}
s=a;
if(w ==1){
cout<<"实型常量为:";
while(s!=q){
cout<<s;
s++;
}
for(i=0;i<t;i++)a[i]=NULL;
}
else {
cout<<"整型常量为:";
while(s!=q){//识别整型常量
cout<<s;
s++;
}
for(i=0;i<t;i++)a[i]=NULL;
}
cout<<endl;
}
else p++;
}
return 0;
}
时间:2012-10-30 晚
要求:输入一串字符串,对其进行词法分析,并且按照(<种别>,<字符串/数字>)格式进行输出
种别编码:
符号 种别 符号 种别 符号 种别
begin 1 + 13 <= 22
if 2 - 14 > 23
then 3 15 >= 24
while 4 / 16 = 25
do 5 : 17 ; 26
end 6 := 18 ( 27
l(l|d) 10 < 20 ) 28
数字① 11 <> 21 # 0
①数字的词法正规式如下:( +|-|ε ) dd(dd | ε)( e ( +|-|ε ) dd|ε)
ps:输入的字符串以“#”结尾
运行环境:VC++60
说明:搜索网上的资源,大部分的“数字”部分都是dd形式,但这次试验要求的是①形式,因而在数字部分做了很大努力。与dd形式的不同有三个地方——ch是数字时,ch是+后接着是数字形式,ch是-后接着是数字形式。然而由于水平有限,时间较短,每个“加号”或“减号”后必须要在输入数字正负符号,否则会默认“+”“-”为正负符号而不是“加号”“减号”。希望能有简单方法解决这个问题。
源代码:
#include <stdioh> //定义I/O库所用的某些宏和变量
#include <stringh> //定义字符串库函数
#include <mathh> //定义数学运算符号库函数
char prog[80],token[8]; //prog:缓冲区;token:一个有意义的字符串
char ch; //ch:当前处理的字符
int syn,p,m,n,f,e;
//syn:类别;p,m,n:计数变量;f,标记数字正负;e,10的次方数
double sum; //sum,数字
char rwtab[6]={"begin","if","then","while","do","end"};
//基本字表置初值
void main(void) //主函数
{
void scaner(void); //声明函数
p=0;
printf("\n请输入字符串:\n");
do{ //输入的字符放入缓冲区
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
do{ //分析词法并输出结果
scaner();
switch(syn)
{
case 11:printf("(%2d,%16g)\n",syn,sum);break;
case -1:printf("输入错误\n");break;
default:printf("(%2d,%16s)\n",syn,token);
}
}while(syn!=0);
}
void scaner(void)
{
for(n=0;n<8;n++) //token初始化
token[n]=NULL;
ch=prog[p++];
while(ch==' ') //如果取消空字符(目前空字符只包括空格)
ch=prog[p++];
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
//如果ch是字母字符
{
m=0;
while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
//如果ch是字母字符或数字字符
{
token[m++]=ch;
ch=prog[p++]; //读下一个字符
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1; //给出syn值
break;
}
}
else if(ch>='0'&&ch<='9') //数字(1)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum10+ch-'0';
ch=prog[p++];
}
if(ch=='') //有小数点
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e10+ch-'0';
ch=prog[p++];
}
}
e=ef;
sum=sumpow(10,e);
}
p--;
syn=11;
}
else switch(ch)
{
case '<':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='>') //<>
{
syn=21;
token[m++]=ch;
}
else if(ch=='=') //<=
{
syn=22;
token[m++]=ch;
}
else //<
{
syn=20;
p--;
}
break;
case '>':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='=') //>=
{
syn=24;
token[m++]=ch;
}
else //>
{
syn=23;
p--;
}
break;
case ':':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='=') //:=
{
syn=18;
token[m++]=ch;
}
else //:
{
syn=17;
p--;
}
break;
case '+':
ch=prog[p++];
if(ch>='0'&&ch<='9') //数字(2)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum10+ch-'0';
ch=prog[p++];
}
if(ch=='') //有小数点
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e10+ch-'0';
ch=prog[p++];
}
}
e=ef;
sum=sumpow(10,e);
}
p--;
syn=11;
}
else //+
{
syn=13;
p--;
ch=prog[p-1];
token[0]=ch;
}
break;
case '-':
ch=prog[p++];
if(ch>='0'&&ch<='9') //数字(3)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum10+ch-'0';
ch=prog[p++];
}
if(ch=='') //有小数点
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e10+ch-'0';
ch=prog[p++];
}
}
e=ef;
sum=sumpow(10,e);
}
sum=-sum;
p--;
syn=11;
}
else //-
{
syn=13;
p--;
ch=prog[p-1];
token[0]=ch;
}
break;
case '': syn=15;token[0]=ch;break;
case '/': syn=16;token[0]=ch;break;
case '=': syn=25;token[0]=ch;break;
case ';': syn=26;token[0]=ch;break;
case '(': syn=27;token[0]=ch;break;
case ')': syn=28;token[0]=ch;break;
case '#': syn=0;token[0]=ch;break;
default: syn=-1;
}
}
试试吧
既然是C语言词法分析器,那就是用C/C++对一段C语言文本进行词法分析,C语言中的for语句、while语句、switch语句、if语句等等的进行分析并将其提取出来的一个设计和实现过程而矣
这是大学专门有一门《编译原理》的课程而矣
这个是编译原理的课程设计吧, 做词法分析这个题目算是最简单的了
只需输入合法词的正则表达式,就可以输出一个确定有限状态自动机(DFA),而DFA的表现形式,往往是一张分析表。
有了词法分析器的自动生成器,则可以避免繁琐的单词识别程序,直接对照分析表即可得出yes or no,
以上就是关于C语言程序设计题全部的内容,包括:C语言程序设计题、求C语言编译原理语法分析程序、做一个简单的词法分析器, 一:要求能识别C程序中的部分关键字 int, char ,float if,else main, prin等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)