递归下降文法,LL文法,优势在于文法实现相对LR文法简单,缺点在于不接受左递归文法,语义实现基于L属性集,实现难度较大
LR文法,能够接受左递归(对输入文法要求低),语义实现基于S属性集,归约时可以进行语法制导翻译,实现直观简洁,缺点在于LR文法需要预先构建LR自动机,算法较为复杂
LR自动机,项集,闭包,GOTO函数
LR归约时需要堆栈结合自动机状态进行
堆栈归约例子
N → a ( N, N )
N → ε
###############堆栈###########
def parse_tree():
stack = []
grammar = 0
for i in range(len(stmt)):
if stmt[i]=='(':
grammar=1
pass
elif stmt[i]==')':
grammar=0
node=stack.pop(0)
pass
elif stmt[i]==',':
grammar=2
pass
else:
_node=Node()
_node.value=expression[i]
if(grammar==1):
stack[0].left=_node
elif(grammar==2):
stack[0].right=_node
stack.insert(0, _node)
return node
网友评论