一个自底向上的语法分析过程对应为一个输入串构造语法分析书的过程,它从叶子节点开始,通过shift和reduce操作逐渐向上到达根节点。
自底向上的语法分析需要一个堆栈来存放解析的符号
例子:解析1+2
stack | input |
---|---|
null | 1+2 |
NUM | +2#开始读入一个字符,并把对应的token放入解析堆栈,为shift操作。 |
factor | +2 #根据语法推导式,factor->NUM,将NUM出栈,factor入栈,成为reduce |
expr | +2 #继续做reduce操作,但是由于语法推导有两个产生,所以需要向前看一个符号才能判断是进行shift还是reduce,即语法解析的LA |
expr+ | 2 #shift操作 |
expr+NUM | 2 #shift操作 |
expr+factor | null #根据factor的产生式进行reduce |
expr | null #reduce操作 |
statement | null #reduce操作 |
此时规约到开始符号,并且输入串也为空,代表语法解析成功
所以实现自底向上的语法解析关键就是识别堆栈上是应该进行shift还是reduce操作。
进行暴力匹配,搜索堆栈上的符号和所有的语法推导式进行匹配 x
构造一个状态机来根据堆栈压入或弹出后的状态来决定是否进行reduce操作