2013-04-10 25 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 

我仍想知道是否有一個更優雅的解決了這一點。