实验一
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验一相关的知识,希望对你有一定的参考价值。
实验一、词法分析程序实验
商业软件工程 张宇健 201506110176
实验目的
编制一个词法分析程序。
实验内容:
1. 对字符串表示的源程序
2. 从左到右进行扫描和分解
3. 根据词法规则:
单词符号 |
种别码 |
单词符号 |
种别码 |
begin |
1 |
: |
17 |
if |
2 |
:= |
18 |
then |
3 |
< |
20 |
while |
4 |
<= |
21 |
do |
5 |
<> |
22 |
end |
6 |
> |
23 |
l(l|d)*(标识符) |
10 |
>= |
24 |
dd*(整数) |
11 |
= |
25 |
+ |
13 |
; |
26 |
- |
14 |
( |
27 |
* |
15 |
) |
28 |
/ |
16 |
# |
0 |
4. 识别出一个一个具有独立意义的单词符号
5. 以供语法分析之用
6. 发现词法错误,则返回出错信息。
实验要求:
输入:源程序字符串
输出:二元组(种别,单词符号本身)
实验方法、步骤及结果测试
源程序名:
源程序名: 实验1.c
可执行程序名:实验1.exe
原理分析及流程图
1) 存储结构:一维顺序数组存储。
2) 算法关键定义:
01. 定义全局变量o存放单词种别码
02. 定义数组x存放整个字符串,数组z存放临时字符串
03. 定义数组y存放关键字
3) 流程图:
N
N
Y N
Y
Y
N
N
Y
源代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#define n 100
void ss();
char *y[n]={"begin","if","then","while","do","end"},x[n],ch,z[8];
int i,j=0,k,o;
main()
{
printf("请输入你需要查询的字符串(以#结束)");
do{
ch=getchar();
x[j++]=ch;
}while(ch!=‘#‘);
j=0;
do
{
ss();
switch(o)
{
case -1:printf("词法分析 出错\n");break;
default :printf("<%d,%s>\n",o,z);break;
}
}while(o!=0);
printf("词法分析 成功\n");
getchar();
}
void ss()
{
for(k=0;k<8;k++)
{
z[k]=‘\0‘;
}
k=0;
ch=x[j++];
while(ch==‘ ‘)
{
ch=x[j++];
}
if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘0‘&&ch<=‘9‘))
{
do{
z[k++]=ch;
ch=x[j++];
}while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘));
o=10;
for(i=0;i<6;i++)
{
if(strcmp(z,y[i])==0)
o=i+1;
}
j--;
}
else if(ch>‘0‘&&ch<=‘9‘)
{
j--;
do{
z[k++]=x[j++];
ch=x[j];
}while(ch>=‘0‘&&ch<=‘9‘);
o=11;
return;
}
else
{
switch(ch)
{
case ‘+‘:o=13;z[0]=ch;break;
case ‘-‘:o=14;z[0]=ch;break;
case ‘*‘:o=15;z[0]=ch;break;
case ‘/‘:o=16;z[0]=ch;break;
case ‘:‘:o=17;z[0]=ch;
ch=x[j++];
if(ch==‘=‘){z[1]=ch;o++;}
else j--;
break;
case ‘<‘:o=20;z[0]=ch;
ch=x[j++];
if(ch==‘>‘){z[1]=ch;o++;}
else if(ch==‘=‘){z[1]=ch;o=o+2;}
else j--;
break;
case ‘>‘:o=23;z[0]=ch;
ch=x[j++];
if(ch==‘=‘){z[1]=ch;o++;}
else j--;
break;
case ‘=‘:o=25;z[0]=ch;break;
case ‘;‘:o=26;z[0]=ch;break;
case ‘(‘:o=27;z[0]=ch;break;
case ‘)‘:o=28;z[0]=ch;break;
case ‘#‘:o=0;z[0]=ch;break;
default: printf("词法分析出错! 请检查是否输入非法字符\n");o=-1;break;
}
}
}
以上是关于实验一的主要内容,如果未能解决你的问题,请参考以下文章
模式识别与图像处理课程实验一:图像处理实验(颜色算子实验SusanHarris角点检测实验 sobel边缘算子检测实验)