语法分析程序
#include<stdio.h>
#include <stdlib.h>
typedef struct link //字符链表
{
char data;
struct link *next;
}Link;
char special[10];
void specialchar(Link *charhead);
main()
{
char n;
Link *charhead; //定义头结点
Link *p,*q;
charhead=q=(Link *)malloc(sizeof(Link)); //申请空间
charhead->next=q; //初始化链表
q->next=NULL;
printf("请输入一个字符串:");
do
{
scanf("%c",&n);
if(n=='
')
break;
p=(Link *)malloc(sizeof(Link));
p->data=n; //把输入的字符存入链表中
p->next=NULL;
q->next=p;
q=p;
}while(n!='
');
q=charhead->next;
/*while(q!=NULL)
{
printf("%c",q->data);
q=q->next;
}*/
printf("语法分析:
");
specialchar(charhead);
}
void specialchar(Link *charhead)
{
Link *q,*p;
int i;
q=charhead->next;
while(q!=NULL)
{
switch(q->data)
{
case 'b': //判断是否是标识符begin
special[0]=q->data; //一步一步存入数组
q=q->next;
if(q->data=='e')
{
special[1]=q->data;
q=q->next;
if(q->data=='g')
{
special[2]=q->data;
q=q->next;
if(q->data=='i')
{
special[3]=q->data;
q=q->next;
if(q->data=='n')
{
special[4]=q->data;
printf("<标识符> ");
for(i=0;i<5;i++)
printf("%c",special[i]);
printf("
");
}
}
}
}
break;
case 'i': //判断是否是标识符if
special[0]=q->data;
q=q->next;
if(q->data=='f')
{
special[1]=q->data;
printf("<标识符> ");
for(i=0;i<2;i++)
printf("%c",special[i]);
printf("
");
}
break;
case 't':
special[0]=q->data;
q=q->next;
if(q->data=='h')
{
special[1]=q->data;
q=q->next;
if(q->data=='e')
{
special[2]=q->data;
q=q->next;
if(q->data=='n')
{
special[3]=q->data;
printf("<标识符> ");
for(i=0;i<4;i++)
printf("%c",special[i]);
printf("
");
}
}
}
break;
case 'w':
special[0]=q->data; //一步一步存入数组
q=q->next;
if(q->data=='h')
{
special[1]=q->data;
q=q->next;
if(q->data=='i')
{
special[2]=q->data;
q=q->next;
if(q->data=='l')
{
special[3]=q->data;
q=q->next;
if(q->data=='e')
{
special[4]=q->data;
printf("<标识符> ");
for(i=0;i<5;i++)
printf("%c",special[i]);
printf("
");
}
}
}
}
break;
case 'd':
special[0]=q->data;
q=q->next;
if(q->data=='o')
{
special[1]=q->data;
printf("<标识符> ");
for(i=0;i<2;i++)
printf("%c",special[i]);
printf("
");
}
if(q->data=='d')
{
special[1]=q->data;
q=q->next;
if(q->data=='*')
{
special[2]=q->data;
printf("<标识符> ");
for(i=0;i<3;i++)
printf("%c",special[i]);
printf("
");
}
}
break;
case 'e':
special[0]=q->data;
q=q->next;
if(q->data=='f')
{
special[1]=q->data;
q=q->next;
if(q->data=='f')
{
special[2]=q->data;
printf("<标识符> ");
for(i=0;i<3;i++)
printf("%c",special[i]);
printf("
");
}
}
break;
case 'l':
special[0]=q->data; //一步一步存入数组
q=q->next;
if(q->data=='(')
{
special[1]=q->data;
q=q->next;
if(q->data=='l')
{
special[2]=q->data;
q=q->next;
if(q->data=='|')
{
special[3]=q->data;
q=q->next;
if(q->data=='d')
{
special[4]=q->data;
q=q->next;
if(q->data==')')
{
special[5]=q->data;
q=q->next;
if(q->data=='*')
{
special[6]=q->data;
printf("<标识符> ");
for(i=0;i<7;i++)
printf("%c",special[i]);
printf("
");
}
}
}
}
}
}
break;
case '+':
printf("<加号> %c",q->data);
printf("
");
break;
case '-':
printf("<减号> %c",q->data);
printf("
");
break;
case '*':
printf("<乘号> %c",q->data);
printf("
");
break;
case '/':
printf("<标识符> %c",q->data);
printf("
");
break;
case ':':
special[0]=q->data;
q=q->next;
if(q->data=='=')
{
special[1]=q->data;
printf("<赋值号> ");
for(i=0;i<2;i++)
printf("%c",special[i]);
}
else
printf("<赋值号> %c",special[0]);
printf("
");
break;
case '<':
special[0]=q->data;
q=q->next;
if(q->data=='=')
{
special[1]=q->data;
printf("<标识符> ");
for(i=0;i<2;i++)
printf("%c",special[i]);
printf("
");
}
else if(q->data=='>')
{
special[1]=q->data;
printf("<标识符> ");
for(i=0;i<2;i++)
printf("%c",special[i]);
printf("
");
}
else{
printf("<小于号> ");
printf("%c",special[0]);
printf("
");
}
break;
case '>':
special[0]=q->data;
q=q->next;
if(q->data=='=')
{
special[1]=q->data;
printf("<标识符> ");
for(i=0;i<2;i++)
printf("%c",special[i]);
printf("
");
}
else{
printf("<大于号> ");
printf("%c",special[0]);
printf("
");
}
break;
case '=':
printf("<赋值符> %c",q->data);
printf("
");
break;
case ';':
printf("<分号> %c",q->data);
printf("
");
break;
case '(':
printf("<左括号> %c",q->data);
printf("
");
break;
case ')':
printf("<右括号> %c",q->data);
printf("
");
break;
case '#':
printf("<井号> %c",q->data);
printf("
");
break;
}
q=q->next;
}
}