Как реализовать скобки и логические операторы, используя PLY (парсер) в Python - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь реализовать парсер с помощью 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

Потому что он не может обрабатывать скобки?

...