我正在尝试使用PLY实现解析器。我创建了数值运算符(+,-,*,/)的基本功能。而且我想实现括号,以便可以优先考虑计算,还可以实现OR
和AND
运算符。我试图在表达式函数中使用,但是它不起作用。这是我的代码:
import ply.lex as lex
import ply.yacc as yacc
import sys
tokens = [
'INT',
'FLOAT',
'NAME',
'PLUS',
'MINUS',
'DIVIDE',
'MULTIPLY',
'EQUALS',
'LPAREN',
'RPAREN',
'AND',
'OR']
t_PLUS = r'\+'
t_MINUS = r'\-'
t_MULTIPLY = r'\*'
t_DIVIDE = r'\/'
t_EQUALS = r'\='
t_LPAREN = r'\('
t_RPAREN = r'\)'
t_AND = r'\&'
t_OR = r'\|'
t_ignore = r' '
lexer = lex.lex()
precedence = (
('left', 'PLUS', 'MINUS'),
('left', 'MULTIPLY', 'DIVIDE'),
('left', 'LPAREN', 'RPAREN'),
('left', 'OR', 'AND'))
def p_expression(p):
'''
expression : expression PLUS expression
| expression MINUS expression
| expression DIVIDE expression
| expression MULTIPLY expression
| LPAREN expression PLUS expression RPAREN
| LPAREN expression MINUS expression RPAREN
| LPAREN expression DIVIDE expression RPAREN
| LPAREN expression MULTIPLY expression RPAREN
'''
p[0] = (p[2], p[1], p[3])
def run(p):
global env
if(type(p)) == tuple:
if p[0] == '+':
return run(p[1]) + run(p[2])
elif p[0] == '-':
return run(p[1]) - run(p[2])
elif p[0] == '/':
return run(p[1]) / run(p[2])
elif p[0] == '*':
return run(p[1]) * run(p[2])
elif p[0] == '=':
env[p[1]] = run(p[2])
print(env)
elif p[0] == 'var':
if p[1] not in env:
return 'Undeclared variable found!'
else:
return env[p[1]]
else:
return p
例如,有人可以帮我实现括号吗?
当我想使用(1 + 1)* 2时要先执行1 + 1。喜欢它应该是。但是,如果要使用一对以上的括号,那么首先要放在外面,等等。另外,我应该如何实现逻辑运算符AND和OR?
运行代码并键入:(1 + 1)
给我None
。我想是这样的:
def p_empty(p):
'''
empty :
'''
p[0] = None
因为它不能处理括号?