编译原理词法分析
来源:互联网 发布:ai软件下载中文版 编辑:程序博客网 时间:2024/05/17 23:11
识别码
单词符号
种别码
单词符号
种别码
bgin
1
:
17
If
2
:=
18
Then
3
<
20
wile
4
<>
21
do
5
<=
22
end
6
>
23
lettet(letter|digit)*
10
>=
24
dight dight*
11
=
25
+
13
;
26
—
14
(
27
*
15
)
28
/
16
#
0
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
scaner();
int main()
{
p=0;
printf("\n please input a string(end with '#'):\n");
do{
scanf("%c",&ch);//是字符型而不是整型
prog[p++]=ch;
}while(ch!='#');
p=0;
do{
scaner();
switch(syn){
case 11:
printf("(%-10d %5d)\n",sum,syn);
break;
case -1:
printf("you have input a wrong sentence!\n");
getchar();
exit(0);
default:
printf("(%-10s %5d)\n",token,syn);
break;
}
}while(syn!=0);
getchar();
return 0;
}
scaner()
{
sum=0;
for(m=0;m<8;m++)
token[m++]='\0';//将数组清空
ch=prog[p++];
m=0;
while((ch==' '||ch=='\n'))
ch=prog[p++];//ch将指向下一个元素
if(((ch<='z')&&(ch>='a')||(ch<='Z')&&(ch>='A')))//这里只能判断第一个元素。
{
while(((ch<='z')&&(ch>='a')||(ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))//因此需要一个循环。
{
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;//是字母但不是标示符中的符号时,识别码为10.
for(n=0;n<6;n++)//标示符的识别码
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{
case '<':
token[m++]=ch;
ch=prog[p++];//判断小于号的下一个元素,看是不是小于等于号。
if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
break;
case '>':
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case '+':
token[m++]=ch;
ch=prog[p++];
if(ch=='+')
{
syn=17;
token[m++]=ch;
}
else
{
syn=13;
p--;
}
break;
case '-':
token[m++]=ch;
ch=prog[p++];
if(ch=='-')
{
syn=29;
token[m++]=ch;
}
else
{
syn=14;
p--;
}
break;
case'!':
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=21;
token[m++]=ch;
}
else
{
syn=31;
p--;
}
break;
case'=':
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=25;
token[m++]=ch;
}
else
{
syn=18;
p--;
}
break;
case'*':
syn=15;
token[m++]=ch;
break;
case'/':
syn=16;
token[m++]=ch;
break;
case'(':
syn=27;
token[m++]=ch;
break;
case')':
syn=28;
token[m++]=ch;
break;
case'{':
syn=5;
token[m++]=ch;
break;
case'}':
syn=6;
token[m++]=ch;
break;
case';':
syn=26;
token[m++]=ch;
break;
case'\"'://转义字符。。
syn=30;
token[m++]=ch;
break;
case'#':
syn=0;
token[m++]=ch;
break;
case':':
syn=17;
token[m++]=ch;
break;
default:
syn=-1;
break;
}
token[m++]='\0';
}
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理--词法分析
- 【编译原理】词法分析
- 编译原理-词法分析
- 编译原理词法分析
- 编译原理实验----词法分析
- 编译原理词法分析程序
- 编译原理:PL0词法分析
- 编译原理 之 词法分析
- 编译原理简单词法分析
- 编译原理之词法分析
- 编译原理之词法分析
- 《coredump问题原理探究》windows版7.4节set
- 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O
- BBS项目笔记之七:Ajax实现帖子回复
- Android 使用SAX或者DOM或者pull解析XML文件
- 程序员成熟的标志(转)
- 编译原理词法分析
- BIEE 11g去掉图形阴影
- 从表中随机返回n条记录。可以修改下面的语句,要求下次执行时产生不同的结果集?
- 软件设计不同阶段的关注点
- C/C++如何传递二维数组?
- 手把手教你写专利申请书/如何申请专利
- SIGPIPE received in android system native app on Jellybean
- 构造函数链
- C++箴言:必须返回对象时别返回引用