【发布时间】:2014-03-03 14:02:55
【问题描述】:
我不知道为什么会这样,但是我的ident 终端被推入堆栈两次。这不会发生在我的语法中的任何其他终端上。我所有的 save_xxx_function 只需将转换后的值添加到 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 => [2, 3, '*'] x * 2 => ['x', 'x', 2, '*']
【问题讨论】: