有限自动机的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二 有限自动机的设计
1.正规式与功能描述
功能:识别十进制数、八进制、十六进制、实数、科学计数
八进制:
oct →0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
十六进制数: ( HEX ,值 )
hex →0x(0|1|...|9|a|...|f|A|…|F)(0|...|9|a|...|f |A|…|F)*
无符号数 :整数、实数与科学计数:
digit →0|1|...|9
digits →digit digit*
Optional_fraction →.digits|ɛ
Optional_exponent →(e(+|-|ɛ)digits)|ɛ
Num →digits optional_fraction optional_exponent
状态转换图:
八进制:
十六进制:
1 2 start 0
3 0-7
0-7 4 *
other
ret
1 7 start 0 8 9 10
0-9 a-f
x 0-9 a-f other *
re
整数、实数、科学计数(无符号):
合并转换图:
测试截图:
第二组:
程序代码:
以下代码围绕合并的转换而写#include
#include
#include
{
char c;
printf("以#结束程序,以回车结束输入数字(十进制、八进制、十六进制、实数、科学计数):\n");
c=getchar();
while(c!='#')
{
while(c==' ' || c=='\t')//去掉前导空格或制表符
c=getchar();
if(c=='0')//如果是0进入状态2
{
c=getchar();
if(c>='0'&&c<='7')//如果成立进入状态3
{
c=getchar();
while(c>='0'&&c<='7')
{
c=getchar();
}
while(c==' ' || c=='\t')
c=getchar();
if(c=='\n')
printf("oct\n");//状态4
else
{
printf("不接受\n");
fflush(stdin);//清空缓冲区
}
}
else if(c=='x'||c=='X')//如果成立进入状态5 {
c=getchar();
while((c>='0'&&c<='9')||(c>='a'&&c<='f'))
{
c=getchar();
}
while(c==' ' || c=='\t')//去掉前导空格或制表符c=getchar();
if(c=='\n')
printf("hec\n");//状态7
else
{
printf("不接受\n");
fflush(stdin);
}
}
else if(c=='\n')
{
printf("dec\n");
}
else
{
printf("不接受\n");
fflush(stdin);
}
}
else if(c>='1'&&c<='9')//如果成立进入状态8 {
c=getchar();
while(c>='0'&&c<='9')
{
c=getchar();
}
if(c=='\n')
{
printf("dec\n");
}
else if(c=='.'||c=='e'||c=='E')
{
if(c=='.')
{
c=getchar();
while(isdigit(c))
c=getchar();
while(c==' ' || c=='\t')//去掉前导空格或制表符c=getchar();
}
if(c=='e'||c=='E')
{
c=getchar();
if(c=='+'||c=='-'||isdigit(c))
{
c=getchar();
while(isdigit(c))
c=getchar();
while(c==' ' || c=='\t')//去掉前导空格或制表符c=getchar();
if(c=='\n')
printf("科学计数\n");
else
{
printf("不接受\n");
fflush(stdin);
}
}
else
{
printf("不接受\n");
fflush(stdin);
}
}
else if(c=='\n')
printf("实数\n");
else
{
printf("不接受\n");
fflush(stdin);
}
}
else
{
printf("不接受\n");