例如:在长跑比赛开始时 我处于等待的状态下,待裁判喊 预备 时,我就会从等待状态转换到预备状态。听到裁判的枪声时,我就从预备状态转换到奔跑状态 。
这个过程就至关于有限状态自动机。java
FSM的状态就是一个事件当前所处于的状况。编程
例如:对输入的字符进行判断 判断字符串组成的数字属于整型仍是浮点型。 同时它也是词法分析的核心 可用于分析一串字符中给的组成词的含义。数组
由于最近在学习编译原理,因此想实现一个简单的FSM。 计划使用java语言。但愿能作一个分析所输入的字符串,解析出字符串组成的字串属于什么数据类型。学习
在编写FSM程序以前须要先画出状态转化图,在个人构想里:字体
1.整数是只由0~9的数字组成。blog
2.浮点数比整数多了一个小数点,而且小数点不能出如今数字的第一位和最后一位。事件
3.增长科学计数法数字,例如:1.2e2 其中用e2代替10的二次方 e的左边必须是小数,而且小数点只能出如今紧跟着第一位数字的后面。字符串
4.能够对一行字符串进行解析。数学
基于上面4点,我大体画了一下状态转换图:编译
红色字体表明8种状态
箭头上的 0-9 e . - 带当输入的字符位他们时
黄色下划线表明改状态能够输出结果了
蓝色表明循环
例如:初始状态为0时,当输入0-9任意一个字符时 状态0向状态1转变。
当继续输入0-9时状态不变,可是状态1在输入结束后能够输出 int。
在状态1的前提下若输入 小数点,那么就会向状态2转变。状态2不支持输出。
在状态2的前提下输入0-9那么就会向状态3转变,同时,状态3支持输出。以此类推
状态1能够输出int (123)
状态3能够输出float(123.4)
状态6能够输出科学计数法(1.2e2)
状态7能够输出科学计数法(1.2e-2)
如何才能将这些状态信息表达出来,我使用的是二位数组
数组的纵轴表示8中状态
数组横轴表示输入的字符
数组元素表示下一跳状态
根据状态转换图能够把二维表填满
好比:
第0行的第0列 表示 在状态0时输入字符0
第0行的第1列 表示 在状态0时输入字符1
第0行的第10列 表示 在状态0时输入字符.
第0行的第11列 表示 在状态0时输入字符e
第0行的第12列 表示 在状态0时输入字符-
数组元素表示下一跳状态值
简单填一下 -1表示错误状态 大概是这个样子 貌似多了一行,并且填的时候可能有填错的。不过大概就这样先吧 哈哈。
经过观察发现 能够进行简化 ,对纵轴的下标0-9统一用下标0来表示吧
这样子就二维数组就没那么大了。
下一次用代码一步步实现