# # # # # # # # # # # # # # # # # # # # # # # # # # # #
#  Framework provided by Daan de Graaf(UvA)           #
#  For Automaten en Formele Talen                     #
#  Under Guidance of Inge Bethke(UvA)                 #
#  Last edited 2018-04-05 by Bas van den Heuvel (UvA) #
# # # # # # # # # # # # # # # # # # # # # # # # # # # #

from CFG import CFG
import pickle
import sys

# The actual grammar
G = CFG('''
{1} START -> ASSIGN EOF
{2} ASSIGN -> ID EQU EXP [EQU]
{3} EXP -> TERM Erest
{4} Erest -> ADD TERM [ADD] Erest
{5} Erest -> SUB TERM [SUB] Erest
{6} Erest -> epsilon
{7} TERM -> FACTOR Trest
{8} Trest -> MUL FACTOR [MUL] Trest
{9} Trest -> DIV FACTOR [DIV] Trest
{10} Trest -> epsilon
{11} FACTOR -> LBT EXP RBT
{12} FACTOR -> INT
{13} FACTOR -> ID
''')

# PARSE TABLE
#
#          (   )   +   -   *   /   Number   ID   eof
# --------------------------------------------------
# S                                         1
# --------------------------------------------------
# A                                         2
# --------------------------------------------------
# E        3                         3      3
# --------------------------------------------------
# Erest        6   4   5                         6
# --------------------------------------------------
# T        7                         7      7
# --------------------------------------------------
# Trest       10  10  10   8   9                10
# --------------------------------------------------
# F       11                        12      13

Table = {'START': {'ID': 1},
         'ASSIGN': {'ID': 2},
         'EXP': {'LBT': 3, 'INT': 3, 'ID': 3},
         'Erest': {'RBT': 6, 'ADD': 4, 'SUB': 5, 'EOF': 6},
         'TERM': {'LBT': 7, 'INT': 7, 'ID': 7},
         'Trest': {'RBT': 10, 'ADD': 10, 'SUB': 10, 'MUL': 8, 'DIV': 9,
                   'EOF': 10},
         'FACTOR': {'LBT': 11, 'INT': 12, 'ID': 13}
         }


# #### total 35 points #####
class Stack(object):
    # Your implementation here #
    ...


# Used for the eventual postfix expression
def _type_(token):
    if token[0] == '[' and token[-1] == ']':
        if token == '[EQU]':
            return 'assign'
        return 'operator'
    elif token == 'INT':
        return 'value'
    elif token == 'ID':
        return 'variable'
    else:
        return None


# #### total 65 points #####
def parse(source):
    ''' Parse the source using Grammar object G, returns infix result or
    Syntaxerror '''
    # Your implementation here #
    ...


def main(program):
    try:
        lexed = pickle.load(open(program, 'rb'))
    except:
        exit('FileError: file "' + program + '" not found.')

    result = []
    for source in lexed:
        result.append(parse(source))

    print(result)
    pickle.dump(result, open(program.split('.', maxsplit=1)[0] + '.exe', 'wb'))

    print('\nSuccesfully created .exe file!')

if __name__ == '__main__':
    try:
        program = sys.argv[1]
    except:
        exit('RuntimeError: Use CFG.py [.lex]')

    main(program)
