编译原理 无符号数识别程序设计

更新时间:2023-11-27 03:12:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1. 2. 3. 4.

实验目的

设计无符号数识别程序 实验要求

无符号数的有穷自动机的实现

实验环境

VC++6.0 实验原理

1、无符号数的BNF描述如下:

0.<无符号数> ? d <余留无符号数> | . <十进制数> | e <指数部分> 1.<余留无符号数> ? d <余留无符号数> | . <十进制数> | e <指数部分> | ε

2.<十进制小数> ? d <余留十进制小数>

3.<余留十进制小数> e <指数部分> | d <余留十进制小数> | ε 4.<指数部分> ? d <余留整指数> | + <整指数> | - <整指数> 5.<整指数> ? d <余留整指数> 6.<余留整指数> ? d <余留整指数> | ε 2、将G[<无符号数>]文法转换成有穷自动机。

3、构造状态矩阵;将有穷自动机的状S1 S2 ??Sn及输入的字a1 a2 ??am 构成一个n*m的矩阵。

1、状态矩阵设计出一个词法分析程序识别无符号数。 2、扫描无符号数,根据文法给出无符号数出错的位置。 3、工具:C语言或其它高级语言 4、实践时间:8学时

无符号数的有穷自动机实现的思想

用0-----表示无符号数; 用1-----表示余留无符号数; 用2----表示十进制小数;用3-----表示余留十进制小数; 用4-----表示指数部分; 用5-----表示整指数; 用6-----表示余留整指数。

输入无符号数序列,从左到右扫描,遇到“#”号结束扫描。设一个字符数

组,接收输入的无符号数,对输入的无符号数逐一进行分析,用一个中间变量接收当前字符。当前字符值发生错误时,输出错误信息;当前字符值正确时,分析下一个字符,反复判断,直至分析完毕。

3)无符号数的有穷自动机(Z表示结束符) 无符号数有穷自动机由图1所示。

0 1 2 3 4 5 6 d 1 1 3 3 6 6 6 e 4 4 Φ 4 Φ Φ Φ · 2 2 Φ Φ Φ Φ Φ + Φ Φ Φ 5 Φ Φ Φ - Φ Φ Φ Φ 5 Φ Φ ε Φ Z Φ Z Φ Φ Z 5.

软件设计与编程

#include #include int main() {

char wfh[50];/* 用于存放要判断的无符号数*/ int i,zf;

char ch1,ch2;

int index;//出错位置

int point;//小数点的个数标志 char c='y';

while (c=='y'||c=='Y') { printf(\Input Number:\ /*输入要判断的无符号数*/ scanf(\ strcat(wfh,\ /*自动在输入的串末尾加入$结束符*/

i=0; zf=0; /*初始时令zf=0,使得如果输入全不符合时退出*/ point=0; while(wfh[i]!='$') { /*条件:输入不为结束符时执行判断*/ ch1=wfh[i]; /*将第一个字符送入变量ch1*/ ch2=wfh[i+1]; /*将次输入的字符送入变量ch2*/ if(ch1>='0' && ch1<='9') { /*当前字是否0-9的数字*/ if((ch2>='0' && ch2<='9') || ch2=='.' || ch2=='e'||ch2=='$') /*如果是数字,则判断下一个字符是否是\,\,\ zf=1; /*输入为正确标志*/ else{ zf=0; /*输入为错误标志*/ index=i+2; break;//出错地方 } } else if(ch1=='.') { /*如果上面条件不符合,判断是否是小数点*/ if(point<1){ point++;//计算小数点的个数 if(ch2>='0'&&ch2<='9') /*判断小数点后是否是\,或为\,否则出错?*/ zf=1; else { zf=0; index=i+2; break; } } else{ zf=0; index=i+1; break; } } else if(ch1=='e'){ /*判断是否是指数标志*/ /*if(i==0) { zf=0;

index=i+1; break; }*/ if(ch2>='0' && ch2<='9'||ch2=='+'||ch2=='-') /*判断指数标志后是否是\,或是\,-\,\否则出错*/ zf=1; else if(ch2=='$'){ zf=0; index=i+1; break; } else{ zf=0; index=i+2; break; } } else if(ch1=='+' || ch1=='-'){/*如果以上不符,判断是否是\,-,\ if(i==0){ zf=0; index=i+1; break; } if(ch2>='0' && ch2<='9' || ch2=='$')/*\后只能为\否则出错*/ zf=1; else{ zf=0; index=i+2; break; } } else{ zf=0; index=i+1; break; } i++; /* i加1,判断下一个字符*/ } if(zf==0){ /*输入字符串不是无符号数*/ printf(\

} else printf(\/*输入字符串为无符号数*/ printf(\ scanf(\ }

return 0; }

6.

程序测试结果

本文来源:https://www.bwwdw.com/article/teqt.html

Top