gpt4 book ai didi

python - 解析隐式与显式时间运算符

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:34 25 4
gpt4 key购买 nike

我一直在使用 ply 编写 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)

PLY 没有报告任何移位/归约冲突或归约/归约冲突,但我得到以下不一致的信息:

    >>  1 + 2 3
= 9
>> 1 + 2 * 3
= 7

这对我来说似乎很奇怪,因为显式和隐式时间规则具有相同的优先级。但我认为这可能是由于 PLY 为“times”标记分配了优先级,从而将其转移到堆栈上,有利于使用 p_plus 规则减少表达式。我该如何解决这个问题?

编辑:更简单的演示。

最佳答案

快速破解:将 int 标记添加到优先级规范中(具有时间优先级)。然后,int 标记将被适本地转移到符号堆栈上。也就是说(根据原来的问题),

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

这可以工作,但在处理可能大量的标记时会很困惑(开括号,符号、 float 等)。

>>  1 + 2 3
= 7

我仍然想知道是否有更优雅的解决方案。

关于python - 解析隐式与显式时间运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com