Pyparsing Identifiers被推入堆栈两次

时间:2014-02-06 14:48:35

标签: python stack pyparsing

我不确定为什么会这样,但是我的ident终端被推到了堆栈两次。在我的语法中,任何其他终端都不会发生这种情况。我的所有save_xxx_函数只是将转换后的值添加到stack。在save_ident_function的情况下,我只是将第一个令牌添加到堆栈而不进行任何处理。

# Terminal symbols defined here....
ident = Word(alphas, alphanums + '_')

expr = Forward()
atom = Forward()
arg = expr
args = delimitedList(arg)

func_call = (ident + lbrace + Optional(args) + rbrace).setParseAction(save_token_function)

bracketed_list = (lbracket + Optional(delimitedList(atom)) +    rbracket).setParseAction(save_list_function)

atom << ( bracketed_list | func_call | (lbrace + expr.suppress() + rbrace)  |     decimal.setParseAction(save_decimal_function) | integer.setParseAction(save_int_function) | ident.setParseAction(save_ident_function) | sglQuotedString.setParseAction(save_string_function) )

factor = Forward()

factor << atom + ZeroOrMore( (exponent + factor).setParseAction(save_token_function) )

term = factor + ZeroOrMore( (multdivide + factor).setParseAction(save_token_function) )

rel_term = term + ZeroOrMore( (relational + term).setParseAction(save_token_function) )

expr << rel_term + ZeroOrMore( (plusminus + rel_term).setParseAction(save_token_function) )

# Define the grammar now ...
grammar = expr + StringEnd()

# function to just drop the identifier on to the stack
def save_ident_function(s, l, tokens):
token = tokens[0]
stack.append(token)

我为以下表达式获取以下堆栈: 2 * 3 =&gt; [2,3,'*'] x * 2 =&gt; ['x','x',2,'*']

1 个答案:

答案 0 :(得分:0)

好的,我在这里遇到的问题是我正在重新使用ident终端。我使用ident终端作为变量,但我也将它用于func_call(函数调用)非终端。我不确定重复使用这样的终端是否总是不好的做法,或者如果在识别过程中他们在语法规则上调用解析操作。

修复很简单......只需为func_call名称使用不同的终端。

ident = Word(alphas, alphanums + '_')
# Add a non-terminal for the name of a function
func_name = Word(alphas, alphanums + '_')

# Change func_call grammar rule to use func_name for the name instead of ident
func_call = (func_name + lbrace + Optional(args) + rbrace).setParseAction(save_token_function)

此外,func_name没有解析操作func_call。这可能也使事情变得复杂。