2013-04-10 18 views
1

我一直在使用帘布写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规则表达式转移到堆栈中。我怎样才能解决这个问题?

编辑:更简单的演示。

+0

可你只需要添加'open'您优先关联?我在一段时间内没有完成语法 – 2013-04-10 02:35:10

+0

这可能适用于这种情况,但还有其他一些情况需要考虑。例如'1 + 2 3'=> 9与'1 + 2 * 3'=> 7。 – sn6uv 2013-04-10 02:38:26

+0

@JoranBeasley我编辑了这个问题,以使示例更简单。 – sn6uv 2013-04-10 02:45:30

回答

1

快速劈:在int令牌添加到优先级规范(有次优先级)。然后将int令牌适当地移到符号栈上。这是(根据原来的问题),

precedence = (
    ('left', 'plus'), 
    ('left', 'times', 'int'), 
) 

这工作,但与潜在的大量令牌(开括号, 符号,漂浮等)打交道时是凌乱。

>> 1 + 2 3 
= 7 

我仍想知道是否有一个更优雅的解决了这一点。