我有以下语法(这是简化的):
S -> EXPR
EXPR -> ITEM addop EXPR
EXPR -> ITEM
ITEM -> num
ITEM -> ident
有:
num: a floating point number
ident: a string representing an identifier
addop: +
我使用的是python的PLY库,代码如下:
def p_L_S(self,p):
''' S : EXPR'''
p[0] = p[1]
def p_L_EXPR_1(self,p):
''' EXPR : ITEM addop EXPR'''
p[0] = p[1] + p[2]
def p_L_EXPR_2(self,p):
''' EXPR : ITEM'''
p[0] = p[1]
def p_L_ITEM_1(self,p):
''' ITEM : num '''
p[0] = float(p[1])
def p_L_ITEM_2(self,p):
''' ITEM : ident '''
p[0] = value_of_expr_associated_to_ident(p[1])
[...]
在最后一个函数(p\\L\\u ITEM\\u 2)中,我想解释与p[1]相关联的字符串(这是语法可以识别的表达式),而无需启动另一个解析。
现在,函数value_of_expr_associated_to_ident
启动了对ident
关联的表达式的新解析(调用parse
方法)。
但这会导致非常糟糕的性能,即使它起作用。你知道吗
是否有方法将与ident
关联的表达式关联的lexems发送给解析器,以避免必须开始新的解析?
我不知道这是否清楚,如果不清楚,我将试图澄清。你知道吗
非常感谢。 山姆
如果您试图用函数式语言进行某种懒惰的计算,请继续阅读。这并不像看上去那么容易,我只提供了一个大概的方法。你知道吗
如果与标识符相关联的值是表示语言中表达式的普通字符串,则需要递归调用解析。你知道吗
但至少缓存生成的解析树是值得的(这意味着您的解析器需要创建一个解析树,而不是立即进行计算)。或者,可以在将字符串值赋给变量时将其解析到解析树中。你知道吗
无论您如何完成递归解析,您都需要以某种方式处理无限递归,例如
r
的值是r
(或r + 1
)。你知道吗相关问题 更多 >
编程相关推荐