编译原理之路:我的第一个自动机C程序

照着前人的博客写的自动机程序编写方法自己写了一个用来识别浮点数的科学形式的自动机,感觉有很多东西需要总结,涉及到一下一些可以积累的好办法:
关于自动机=>
1.按照自动机草图规划一个跳转状态表,每一个项写清楚在对应的输入下,下一状态跳转谁;【数据结构】=>数组。行列编号各有意义。
缺点:在输入可能性比较多的情况下十分臃肿。
2.声明并定义“自动机”“状态跳转令牌(对应着数组的元)”【数据结构】=>结构体。
结构体里面利用多个成员可更好区别不同元。也可以按照需要加入状态机的功能函数。最朴素的起码要让状态机有一个表示“当前状态”的成员。
缺点:同样地,在输入和跳转情况比较复杂的时候,程序看起来很臃肿。复制粘贴起来麻烦。
3.自动机和“牌”我们都有了,还需要声明和定义一个发起动作的函数,这个函数就是跳转状态的函数,注意自动机程序的逻辑精髓在此:
做好结构struct,做好动作action,并输入后发起动作,最终你能获得结果。

关于C语言的收获=>
1.在结构体中可以定义一个不确定的函数成员,只要能确定函数的返回类型和形参表就可以。想区别开不同函数的时候,按照同样格式进行声明,并在声明结构体实体的时候用上就行。这个方法相当强,意味着我不用声明很多不一样的结构体,就可以用相似的形式进行复用。

注意:
先用这个typedef处理一下返回值和形参表
(我真不知道这个用法叫啥,好用就行,知道的麻烦告诉我这个小菜鸡一下)


typedef void(*actiontype)(pautomata machine, stateType nowState, conditionType nowCondition);

然后结构体这么写就好:

typedef struct {
	stateType nextState;
	actiontype action;

}actionNow, *pActionNow;

这里的这个action函数可以随便弄出来个action_1,action_2随便怎么不一样都行,只要返回值和形参表一样,就能往这个结构体actionNow上面搞。
太好用了吧!
后面,想调用一个结构体实体的时候,也完全可以直接.action()这样去用,反正是根据实例化这个结构体实体的时候用的具体哪个函数再去参数结合的,没毛病。
总之这个办法我要记在我的脑海里。

2.我的标准输入输出流一直学的不好,这里特地积累一下。
首先我这个程序,之前出现问题就是一直读进去’10‘
后面查ASC表,果不其然。10是回车键。所以说输入时要注意吃回车的问题。
下次得记得排查这一点呀。

#include "pch.h"
#include<stdio.h>
/*

statetable:
		 c0		     c1		 c2		 c3		 c4		 c5		 c6		 c7		 c8		 c9	   	 ca[.]	cb[E/e]		cc[+/-]
	s0  {1,}		{1,}	{1,}	{1,}	{1,}	{1,}	{1,}	{1,}	{1,}	{1,}	(trap)	(trap)		(trap)
	s1  {1,}		{1,}	{1,}	{1,}	{1,}	{1,}	{1,}	{1,}	{1,}	{1,}	{2,}	{4,}		{7,}
	s2  {3,}		{3,}	{3,}	{3,}	{3,}	{3,}	{3,}	{3,}	{3,}	{3,}	(trap)	(trap)		(trap)
	s3  {3,}		{3,}	{3,}	{3,}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值