#!/usr/bin/env python3

# To get your _virtual environment_ setup, make sure you have Python 3
# installed and then run the following on a Linux/Mac/Unix system:
#
#   $ python3 -m venv env-playground
#   $ source env-playground/bin/activate
#   $ python3 -m pip install -U pip wheel ply
#

from pprint import pprint

from ply import yacc

from lexer import *


#
# S
#

def p_S(p):
    ''' S : E '''
    p[0] = p[1]

#
# E
#

def p_E_T(p):
    ''' E : T '''
    p[0] = p[1]

def p_E_plus(p):
    ''' E : E PLUS T '''
    p[0] = ( '+', p[1], p[3] )

def p_E(p):
    ''' E : E MINUS T '''
    p[0] = ( '-', p[1], p[3] )

#
# T
#

def p_T_star(p):
    ''' T : T STAR F '''
    p[0] = ( '*', p[1], p[3] )

def p_T_slash(p):
    ''' T : T SLASH F '''
    p[0] = ( '/', p[1], p[3] )

def p_T_F(p):
    ''' T : F '''
    p[0] = p[1]

#
# F
#

def p_F_atom(p):
    ''' F : ID
          | NUM
    '''
    p[0] = p[1]

def p_F_E(p):
    ''' F : LPAREN E RPAREN '''

    p[0] = ( 'E', p[2] )

###########

def p_error(p):
    print(f'Syntax error somewhere...')

parser = yacc.yacc()

def process(data):
    result = parser.parse(data)
    if result:
        print('Result:\n    ', end='')
        pprint(result, indent=4, compact=False)

if __name__ == '__main__':
    if len(sys.argv) > 1:
        for data in sys.argv[1:]:
            print(f'Input: {data}')
            process(data)
    else:
        while True:
            try:
                data = input('parser> ')
            except (EOFError, KeyboardInterrupt):
                break

            if not data:
                continue

            process(data)
