下推自动机具有限自动机的所有部件,如状态、状态转移表等,同时它比有限自动机多一个堆栈,常称为计算栈。下推自动机可以根据情况将终结符或者非终结符压入栈,或者弹出栈。
而LL(1),LR(1)等分析法就是用来分析上下文无关文法的,基于下推自动机的模型。这也是为什么介绍语法分析时,所有的书都会说一个基于LR(1)分析法的预测分析器,都会有三部分组成:状态转移表、控制器和计算栈。而所谓的移进与归约就是入栈与出栈的问题。
最后,举一个例子(好象大家都睡着了 -_-b)
先给出一个文法:
S->0S1 | 01
其中0、1是终结符。
这样一个文法描述的语言其实就是n个0加上相等数量的n个1,这里n是某个整数。
这个文法是一个上下文无关文法,但不是一个正则文法。所以说我们没办法写出一个正则表达式来描述这样一个语言。等于一个能识别这个文法中的任意句子的NFA,我们总能找到这样一个句子,它不是由该文法所定义的,却能被这个NFA接受。换句话说,任意NFA都不能用来判断某个句子是不是由以上这个文法所定义。说得实际一点,如果要求写一个着色程序,输入的文件是一串0、1组成的序列,要求把其中n个0加n个1的序列用红色着色,而其它用黑色的话,我们就不能光用正则表达式匹配来完成这一任务了。
如果上面这个例子还比较抽象的话,那么对于“带有括号的数学表达式”这样一个语言,也是没有办法用正则表达式来进行匹配的。因为描述“带有括号的数学表达式”的文法,也不是一个正则文法,因为其中带有类似:
F->(E)
这样的部分。
而正则文法要求所有的产生式都必须是A->aB或者A->a这样的形式的(其中A、B是非终结符,a是终结符)