解析暗示与明确的时间操作
问题描述:
我一直在使用帘布写LALR解析器和试图解析乘法时所遇到的不一致。解析暗示与明确的时间操作
由于全解析link是几千行代码我将不包括在这里,但我已经创建了一个简单的例子:
import ply.lex as lex
import ply.yacc as yacc
tokens = (
'int',
'times',
'plus',
)
precedence = (
('left', 'plus'),
('left', 'times'),
)
t_ignore = ' \t\n '
t_int = r' \d+ '
t_plus = r' \+ '
t_times = ' \* '
def p_int(args):
'expr : int'
args[0] = int(args[1])
def p_times(args):
'''expr : expr times expr
| expr expr %prec times'''
if len(args) == 3:
args[0] = args[1] * args[2]
elif len(args) == 4:
args[0] = args[1] * args[3]
def p_plus(args):
'expr : expr plus expr'
args[0] = args[1] + args[3]
lex.lex()
parser = yacc.yacc()
while True:
s = raw_input('>> ')
print " = ", parser.parse(s)
有没有转变/减少冲突或减少/减少冲突由帘布层报我却得到了以下矛盾:
>> 1 + 2 3
= 9
>> 1 + 2 * 3
= 7
这似乎很奇怪,我因为显性和隐性时间的规则具有相同的优先级。 但我认为这可能是由于该叠层A优先分配给“时代”令牌的事实,因此有利于减少与p_plus规则表达式转移到堆栈中。我怎样才能解决这个问题?
编辑:更简单的演示。
答
快速劈:在int
令牌添加到优先级规范(有次优先级)。然后将int
令牌适当地移到符号栈上。这是(根据原来的问题),
precedence = (
('left', 'plus'),
('left', 'times', 'int'),
)
这工作,但与潜在的大量令牌(开括号, 符号,漂浮等)打交道时是凌乱。
>> 1 + 2 3
= 7
我仍想知道是否有一个更优雅的解决了这一点。
可你只需要添加'open'您优先关联?我在一段时间内没有完成语法 – 2013-04-10 02:35:10
这可能适用于这种情况,但还有其他一些情况需要考虑。例如'1 + 2 3'=> 9与'1 + 2 * 3'=> 7。 – sn6uv 2013-04-10 02:38:26
@JoranBeasley我编辑了这个问题,以使示例更简单。 – sn6uv 2013-04-10 02:45:30