Home > Blockchain >  IndexError list index out of range?
IndexError list index out of range?

Time:09-01

So I have a code that read from another file, and then looks through it inside the lexer() function. That function works, but I have an error on the parse() function. It says indexerror, but I checked and could not find the problem. I am trying to get the function called getVARRIABLE() to return the error. I have checked the line at which the error happens, which is line 100. Any tips?

Error:

Traceback (most recent call last):
  File "C:\Users\mcqui\OneDrive\Desktop\Programming language for capstones\main.py", line 134, in <module>
    run()
  File "C:\Users\mcqui\OneDrive\Desktop\Programming language for capstones\main.py", line 132, in run
    parse(toks)
  File "C:\Users\mcqui\OneDrive\Desktop\Programming language for capstones\main.py", line 102, in parse
    if toks[i]   " "   toks[i 1][0:6] == "show STRING" or toks[i]   " "   toks[i 1][0:3] == "show NUM" or toks[i]   " "   toks[i 1][0:4] == "show EXPR" or toks[i]   " "   toks[i 1][0:3] == "show VAR":
IndexError: list index out of range

main.py:


from lib2to3.pgen2 import token
from sys import *
tokens = []
symbols = {}

def open_file(filename):
    data = open(filename, 'r').read()
    data  = "<EOF>"
    return data

def lexer(filecontents):
    filecontents = list(filecontents)
    tok = ""
    state = 0
    isexpr = 0
    string = ""
    var = ""
    expr = ""
    varstarted = 0
    n = ""
    for char in filecontents:
        tok  = char
        if tok == " ":
            if state == 0:
                tok = ""
            else:
                tok = " "
        elif tok =="\n" or tok =="<EOF>":
            if expr != "" and isexpr == 1:
                tokens.append("EXPR:"   expr)
                expr = ""
            elif expr != "" and isexpr == 0:
                tokens.append("NUM:"   expr)
                expr = ""
            elif var != "":
                tokens.append("VAR:"   var)
                var = ""
                varstarted = 0
            tok = ""
        elif tok == '=' and state == 0:
            if var != "":
                tokens.append("VAR:"   var)
                var = ""
                varstarted = 0
            tokens.append("EQUALS")
            tok = ""
        
        elif tok == "var " and state == 0:
            varstarted = 1
            var  = tok
            tok = ""
        elif varstarted == 1:
            if tok == '<' or tok == '>':
                if var != "":
                    tokens.append("VAR:"   var)
                    var = ""
                    varstarted = 0
            var  = tok
            tok = ""
        elif tok == "show" or tok == 'SHOW':
            tokens.append("show")
            tok = ""
        elif tok.isdigit():
            expr  = tok
            tok = ""
        elif tok == ' ' or tok=='-' or tok=='*'or tok=='/' or tok=='(' or tok==')':
            isexpr = 1
            expr =tok
            tok = ""
        elif tok == "\"":
            if state == 0:
                state = 1
            elif state == 1:
                tokens.append("STRING:"   string   "\"")
                string = ""
                state = 0
                tok = ""
        elif state == 1:
            string  = tok
            tok = ""
    return tokens
    # print(tokens)
    # return ''

def doAssign(varname, varvalue):
    # To get back VAR variable just change to [4:]
    symbols[varname[8:]] = varvalue

def getVARIABLE(varname):
 varname = varname[8:]
 if varname in symbols:
  return symbols[varname]
 else:
  return "VARIABLE ERROR: Undefind VARIABLE"


def parse(toks):
    i = 0
    while(i < len(toks)):
        if toks[i]   " "   toks[i 1][0:6] == "show STRING" or toks[i]   " "   toks[i 1][0:3] == "show NUM" or toks[i]   " "   toks[i 1][0:4] == "show EXPR" or toks[i]   " "   toks[i 1][0:3] == "show VAR":
            if toks[i 1][0:6] == "STRING":
                print(toks[i 1][8:-1])
            elif toks[i 1][0:3] == "NUM":
                print(toks[i 1][4:])
            elif toks[i 1][0:4] == "EXPR":
                print(eval(toks[i 1][5:]))
            elif toks[i 1][0:3] == "VAR":
                print(getVARIABLE(toks[i 1]))
            i =2
        elif toks[i][0:3]   " "   toks[i   1]   " "   toks[i   2][0:6]== "VAR EQUALS STRING" or toks[i][0:3]   " "   toks[i   1]   " "   toks[i   2][0:3]== "VAR EQUALS NUM" or toks[i][0:3]   " "   toks[i   1]   " "   toks[i   2][0:4]== "VAR EQUALS EXPR":
            
            if toks[i 2][0:6] == "STRING":
                doAssign(toks[i], toks[i   2])
            elif toks[i 2][0:3] == "NUM":
                doAssign(toks[i], toks[i   2])
            elif toks[i 2][0:4] == "EXPR":
                doAssign(toks[i],"NUM:"  str(eval( toks[i   2][5:])))
            i =3
    print(symbols)

##################################################################################





def run():
    data = open_file(argv[1])
    toks = lexer(data)
    parse(toks)

run()

input file:

var variable = 10 1308

show amog

CodePudding user response:

toks[i 1] is outside the list when you're on the last token, and toks[i 2] is outside when you're on the 2nd-to-last token. So check if you're in range before doing these tests.

You also need an else: case to increment i when none of the other cases match.

def parse(toks):
    i = 0
    while i < len(toks):
        if i < len(toks) - 1 and (toks[i]   " "   toks[i 1][0:6] == "show STRING" or toks[i]   " "   toks[i 1][0:3] == "show NUM" or toks[i]   " "   toks[i 1][0:4] == "show EXPR" or toks[i]   " "   toks[i 1][0:3] == "show VAR"):
            if toks[i 1][0:6] == "STRING":
                print(toks[i 1][8:-1])
            elif toks[i 1][0:3] == "NUM":
                print(toks[i 1][4:])
            elif toks[i 1][0:4] == "EXPR":
                print(eval(toks[i 1][5:]))
            elif toks[i 1][0:3] == "VAR":
                print(getVARIABLE(toks[i 1]))
            i =2
        elif i < len(toks) - 2 and (toks[i][0:3]   " "   toks[i   1]   " "   toks[i   2][0:6]== "VAR EQUALS STRING" or toks[i][0:3]   " "   toks[i   1]   " "   toks[i   2][0:3]== "VAR EQUALS NUM" or toks[i][0:3]   " "   toks[i   1]   " "   toks[i   2][0:4]== "VAR EQUALS EXPR"):
            
            if toks[i 2][0:6] == "STRING":
                doAssign(toks[i], toks[i   2])
            elif toks[i 2][0:3] == "NUM":
                doAssign(toks[i], toks[i   2])
            elif toks[i 2][0:4] == "EXPR":
                doAssign(toks[i],"NUM:"  str(eval( toks[i   2][5:])))
            i =3
        else:
            i  = 1
    print(symbols)
  • Related