在yacc-Ru中注入新的词素

2024-04-26 04:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下语法(这是简化的):

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发送给解析器,以避免必须开始新的解析?

我不知道这是否清楚,如果不清楚,我将试图澄清。你知道吗

非常感谢。 山姆


Tags: ofto函数selfvalue表达式def语法
1条回答
网友
1楼 · 发布于 2024-04-26 04:58:08

如果您试图用函数式语言进行某种懒惰的计算,请继续阅读。这并不像看上去那么容易,我只提供了一个大概的方法。你知道吗

如果与标识符相关联的值是表示语言中表达式的普通字符串,则需要递归调用解析。你知道吗

但至少缓存生成的解析树是值得的(这意味着您的解析器需要创建一个解析树,而不是立即进行计算)。或者,可以在将字符串值赋给变量时将其解析到解析树中。你知道吗

无论您如何完成递归解析,您都需要以某种方式处理无限递归,例如r的值是r(或r + 1)。你知道吗

相关问题 更多 >