一:缘由:
讨论一个问题:在词法分析中需不需要及怎样去判断字符'-'是负号还是减号。
词法分析的任务是什么?是将一个字符串分解成一个个单词序列。(http://210.33.23.34/course/bianyi/ziyuan%5Cjiaocai%5Cjiangyi%5CChap03.ppt “词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。”)既然是分解成单词符号,如果你把负号和减号定义为两种单词,那么区分他们就是有必要的;如果将之认为是一个单词种类,则不需要区分。
考虑区分的情况,怎么利用DFA将负号和减号区分开呢?
显然,如果'-'前面没有数字,则'-'为负号标志;如果'-'前面有数字,说明它是一个双目运算符,是减号标志。(这里不讨论不符合语法的输入),这就需要在状态转换的时候向回搜索。
DFA是无法完成这个向回搜索工作的,因为DFA状态转换只和目前状态与输入有关。
二DFA的缺点:
这就让我感到DFA在某些问题上的缺点--缺少一种必须的灵活性。
来看一篇paper中的一段话(THOMAS NIEMANN,A GUIDE TO LEX & YACC ,Portland, Oregon ),恰好说到了DFA的这个缺点。
"Now we can easily understand some of lex’s limitations. For example, lex cannot be used to recognize nested structures such as parentheses. Nested structures are handled by
incorporating a stack. Whenever we encounter a “(”, we push it on the stack. When a “)” is encountered, we match it with the top of the stack, and pop the stack. Lex, however,
only has states and transitions between states. Since it has no stack, it is not well suited for parsing nested structures. Yacc augments an FSA with a stack, and can process constructs such as parentheses with ease. The important thing is to use the right tool for the job. Lex is good at pattern matching. Yacc is appropriate for more challenging tasks."
(注:THOMAS提到的lex 是基于DFA的词法分析,文章中FSA是 确定状态有限自动机的意思)
没有栈,没有回朔,只能简单的状态变化,only has states and transitions between states,所以we can easily understand some of lex’s limitations, it is not well suited for parsing nested structures。
三DFA的改进
如果一定要用DFA做带向前或向后搜索的分析也是有办法的。
有几个方法可以解决
1:设置系统状态flag,保留搜索历史信息,在状态转换时自动判定,修改规则
2:增加状态转换时的输入,将历史信息作为转换控制因子
比如在判定符号'-'的种别时,比照历史信息,看是否在'-'前有数字出现。
这就给我们一个启示,将DFA的功能扩展,在状态转换的时候由确定转换变为条件转换(这不同于NFA的转换),当满足不同条件的时候,转向不同的路径。且称之"SFSA";(SwitchFiniteStateAutomaton)
所以THOMAS说"Since it has no stack, it is not well suited for parsing nested structures.",在条件转换中则不存在这样的情况,SFSA用指定的栈和方法保留有用的信息,在状态转换路径的选择时即可以根据搜索记录弹出栈中数据进行向回搜索,亦可以调用方法向前搜索。
四SFSA的意义:
SFSA并不是取代DFA,DFA是SFSA的一个子集;SFSA不能让分析程序理解更加深奥的语言,也并没有卓越的创新,但是可以做到以下几点:
一:统一自动机理论与超前搜索等方法。
在DFA中,不能进行超前或向回搜索;在SFSA中,超前或向回搜索只是SFSA的一个正常功能,超前或向回搜索时只不过是向系统栈中压入或弹出元素。
二:使自动机在系统仿真中应用更加广泛和规范
在系统仿真中,通常要求计算机仿真对象可以自动运行,但是真实世界是一个连续系统,具有时间上的累积效应。
例如,模拟一个疾病感染系统,有些疾病再次感染的效果与个体是否曾经受到感染很有关系,这就需要向回搜索,SFSA可以根据栈历史情况作出有条件的状态转换
再如一个与天气状况有关的公司运营系统,公司的决策受到未来天气情况的影响,这就需要向前搜索。
三:使自动机在模式匹配中的功能更加强大:
显然,使用SFSA不会出现it is not well suited for parsing nested structures这样的窘境。我们可以想到,SFSA可以轻松识别出'-'和'('。
五:总结;
SFSA并不是一个了不起的创造,它只是在DFA的基础上改进的功能更强大的自动机。
SFSA的关键在于条件转换,它不同于有限确定转换(DFA),也不同于不确定转换(NFA),它的状态转换,是有条件的转换,这个转换条件,不仅仅可以根据向前搜索或向后搜索的结果,甚至可以由用户或环境传感器实时给出,实现半自动机或交互机。

1508

被折叠的 条评论
为什么被折叠?



