如何在Python中使用PLY(解析器)实现括号和逻辑运算符

时间:2019-06-20 08:16:42

标签: python parsing operators expression

我正在尝试使用PLY实现解析器。我创建了数值运算符(+,-,*,/)的基本功能。而且我想实现括号,以便可以优先考虑计算,还可以实现ORAND运算符。我试图在表达式函数中使用,但是它不起作用。这是我的代码:

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

因为它不能处理括号?

0 个答案:

没有答案