Я пытаюсь реализовать парсер с помощью 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первый.Как и должно быть.Но также если есть несколько пар скобок, чтобы сделать те, которые находятся снаружи, и так далее.Также, как я должен реализовать логические операторы И и ИЛИ?
Когда я запускаю код и введите: (1 + 1)
дает мне None
.Я думаю, это:
def p_empty(p):
'''
empty :
'''
p[0] = None
Потому что он не может обрабатывать скобки?