我正在使解析器立即将令牌解析为三地址代码。 要在调用函数时生成正确的TAC代码,我需要调用我的函数" GiveTac"解析所有令牌之前和之后。
我的问题是我无法在解析令牌之前找到调用函数的方法。在PLY的文档中有一个第6.11节嵌入式操作,声称你可以简单地添加一个如下的空规则:
def p_foo(p):
"foo : A seen_A B C D"
print("Parsed a foo", p[1],p[3],p[4],p[5])
print("seen_A returned", p[2])
def p_seen_A(p):
"seen_A :"
print("Saw an A = ", p[-1]) # Access grammar symbol to left
p[0] = some_value # Assign value to seen_A
但如果我在我的代码中尝试这个,我总是在输入中得到一个"语法错误!"错误。 这是我的代码:
def p_fun_declaration_type_formal_pars_block(p):
'fun_declaration : before type NAME LPAR formal_pars RPAR block'
def p_fun_before_fun(p):
'before :'
GiveTAC("function",None,None,'main')
p[0]=p[1]
如果我删除"之前"在我的p_fun_declaration_type_formal_pars_block函数中,它确实接受了我的语法。
我的代码的Pastebin链接: Yacc.py