我不确定为什么会这样,但是我的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,'*']
答案 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
。这可能也使事情变得复杂。