gpt4 book ai didi

python - Pyparsing 标识符被压入堆栈两次

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:56 26 4
gpt4 key购买 nike

我不确定为什么会发生这种情况,但我的 ident 终端被推送到堆栈两次。在我的语法中,任何其他终端都不会发生这种情况。我所有的 save_xxx_function 只是将转换后的值添加到堆栈中。对于 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 => [2, 3, '*']x * 2 => ['x', 'x', 2, '*']

最佳答案

好的,所以我遇到的问题是我正在重复使用 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 有。这可能也让事情变得复杂。

关于python - Pyparsing 标识符被压入堆栈两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21606072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com