词法分析程序的设计与实现

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

/*关键字*/
char *key[6]={"begin","if","then","while","do","end"};
char ch;
char input[800],output[20];
int syn, sum, p, m, n, i;//种别码syn,整数sum,p识别第一个字符

void getsym()
{
for(int i = 0; i < 8; i++)
output[i] = NULL;//初始化数组
ch = input[p++];
while(ch == ' '){//下标下移
ch = input[p];
p++;
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){//判断是否为字母
m = 0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
output[m++] = ch;
ch = input[p++];
}
p--;
syn = 10;
for(i=0;i<6;i++)
if(strcmp(output,key[i]) == 0){//判断关键字是否相同
syn = i+1;
break;
}
}
else if(ch>='0'&&ch<='9')
{
{
sum = 0;
while(ch>='0'&&ch<='9')
{
sum=sum*10+ch-'0';
ch=input[p++];
}
}
p--;
syn = 11;
}else switch(ch){
case '+':output[0]=ch;syn=13;break;
case '-':output[0]=ch;syn=14;break;
case '*':output[0]=ch;syn=15;break;
case '/':output[0]=ch;syn=16;break;
case ':':
i = 0;
output[i++] = ch;
ch = input[p++];
if(ch == '='){
output[i++] = ch;
syn = 18;
}else{
syn = 17;
p--;
}
break;
case '<':
i = 0;
output[i++] = ch;
ch = input[p++];
if(ch == '='){
output[i++] = ch;
syn = 21;
}else if(ch == '>'){
output[i++] = ch;
syn = 22;
}else{
syn = 20;
p--;
}
break;
case '>':
i = 0;
output[i++] = ch;
ch = input[p++];
if(ch == '='){
output[i++] = ch;
syn = 24;
}else{
syn = 23;
p--;
}
break;
case '=':output[0]=ch;syn=25;break;
case ';':output[0]=ch;syn=26;break;
case '(':output[0]=ch;syn=27;break;
case ')':output[0]=ch;syn=28;break;
case '#':output[0]=ch;syn=0;break;
}
}


main(){
p = 0;
printf("请输入语句:");
do{
ch = getchar();
input[p++] = ch;
}while(ch != '#');

p = 0;
do{
getsym();
switch(syn)
{
case 11:printf("(%d,%d) ",syn, sum);break;
default:printf("(%d,%s) ",syn, output);break;
}
}while(syn!=0);
}

原文地址:https://www.cnblogs.com/zqy1004/p/11656438.html