C子集语法分析代码

编译原理课程设计,因编译原理没怎么学好,加上快要考试了,没时间看书写代码,所以希望有人提供一个,谢谢!!

第1个回答  2019-09-05
实验任务:完成下述文法所描述的单词符号的词法分析程序。
<标识符>--><字母>|<标识符><字母>|<标识符><数字>
<无符号整数>--><数字>|<无符号整数><数字>
<分界符>-->+|-|*|/|;|(|)|{|}|<|<=|=|!=|>=|>|:=|<空格>
<字母>-->a|…|z|A|…|Z
<数字>-->0|…|9
<空格>-->’

说明:
(1)
假定该语言对字母的大小写不敏感,由指定文件读入预分析的源程序,分析结果再写入指定文件;
(2)
假定语言的关键字为"begin","if","end","else","then","for","while","to","do","and","not","or","write";
程序的功能描述
从左至右扫描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。
本程序规定输出用KeyWord代表关键字,Word代表普通标识符,Digit代表阿拉伯数字,SingleWord代表单分界符,DoubleWord代表双分界符,ERROR代表无法识别的字符。
例如读入下面一段程序:
if(i>1)
return
1;
else
return
0;
输出结果为:
KeyWord
if
SingleWord
(
Word
i
SingleWord
>
Digit
1
SingleWord
)
Word
return
Digit
1
SingleWord
;
KeyWord
else
Word
return
Digit
0
SingleWord
;
提问者:
匿名最佳答案
#include
"stdio.h"
/*定义I/O库所用的某些宏和变量*/
#include
"string.h"
/*定义字符串库函数*/
#include
"conio.h"
/*提供有关屏幕窗口操作函数*/
#include
"ctype.h"
/*分类函数*/
char
prog[80]={'\0'},
token[8];
/*存放构成单词符号的字符串*/
char
ch;
int
syn,
/*存放单词字符的种别码*/
n,
sum,
/*存放整数型单词*/
m,p;
/*p是缓冲区prog的指针,m是token的指针*/
char
*rwtab[6]={"begin","if","then","while","do","end"};
void
scaner(){
m=0;
sum=0;
for(n=0;n<8;n++)
token[n]='\0';
ch=prog[p++];
while(ch=='
')
ch=prog[p++];
if(isalpha(ch))
/*ch为字母字符*/{
while(isalpha(ch)||isdigit(ch))
/*ch
为字母字符或者数字字符*/{
token[m++]=ch;
ch=prog[p++];}
token[m++]='\0';
ch=prog[p--];
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
/*字符串的比较*/{
syn=n+1;
break;}}
else
if(isdigit(ch))
/*ch是数字字符*/{
while(isdigit(ch))
/*ch是数字字符*/{
sum=sum*10+ch-'0';
ch=prog[p++];}
ch=prog[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;
ch=prog[p--];}
break;
case'>':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='='){
syn=24;
token[m++]=ch;}
else{
syn=23;
ch=prog[p--];}
break;
case':':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='='){
syn=18;
token[m++]=ch;}
else{
syn=17;
ch=prog[p--];}
break;
case'+':syn=13;token[0]=ch;break;
case'-':syn=14;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;}}
main()
{
printf("\n\nThe
significance
of
the
figures:\n"
"1.figures
1
to
6
said
Keyword\n"
"2.figures
10
and
11
said
Other
indicators\n"
"3.figures
13
to
28
said
Operators\n");
p=0;
printf("\nplease
input
string:\n");
do
{
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
do{
scaner();
switch(syn){
case
11:
printf("(%d,%d)\n",syn,sum);break;
case
-1:
printf("\n
ERROR;\n");break;
default:
printf("(%d,%s)\n",syn,token);
}
}while(syn!=0);
getch();
}
相似回答