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規則表達式轉移到堆棧中。我怎樣才能解決這個問題?
編輯:更簡單的演示。
可你只需要添加'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