2015-04-26 4 views
0

Это файл basic.py для языка программирования, который я делаю. В настоящий момент это ошибка.Нужна помощь в исправлении ошибки python

from sys import * 

tokens = [] 

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

def lex(filecontents): 
    tok = "" 
    state = 0 
    isexpr = 0 
    string = "" 
    expr = "" 
    n = "" 
    filecontents = list(filecontents) 
    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: 
       #print(expr + "EXPR") 
       tokens.append("EXPR:" + expr) 
       expr = "" 
      elif expr != "" and isexpr == 0: 
       #print(expr + "NUM") 
       tokens.append("NUM:" + expr) 
       expr = "" 
      tok = "" 
     elif tok.lower() == "print": 
      tokens.append("PRINT") 
      tok = "" 
     elif tok.isnumeric(): 
      expr += tok 
      tok = "" 
     elif 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 = "" 
    print(tokens) 
    return tokens 

def parse(toks): 
    i = 0 
    while(i < len(toks)): 
     if toks[i] + " " + toks[i+1][0:6] == "PRINT STRING" or toks[i] + " " + toks[i+1][0:3] == "PRINT NUM" or toks[i] + " " + toks[i+1][0:4] == "PRINT EXPR": 
      if toks[i+1][0:6] == "STRING": 
       print(toks[i+1][7:]) 
      elif toks[i+1][0:3] == "NUM": 
       print(toks[i+1][4:]) 
      elif toks[i+1][0:4] == "EXPR": 
       print(toks[i+1][5:]) 
      i+=2 

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

run() 

здесь файл test.vil (мой язык программирования называется Виллар), что я передаю данные через:

STRING "HELLO WORLD" 
string "Hey world!" 
17 + 3 

В результате я получаю IndexError: List index out of range в строке 62.

Можете ли вы мне помочь? Мне бы хотелось получить советы о том, как его улучшить, если это разрешено здесь.

+4

Ваш индекс списка за пределами допустимого диапазона. Вы используете 'i + 1', поэтому вы выйдете за пределы списка. –

+3

Нет причин публиковать свою ошибку в виде скриншота. Просто скопируйте и вставьте текст здесь. –

+0

Спасибо Daniel Roseman за это, новое для stackoverflow и спасибо L3viathan за редактирование. –

ответ

3

У вас есть строка:

while(i < len(toks)): 

в функции parse. Тем не менее, в этом цикле while вы получаете доступ к элементу toks[i+1], который будет за пределами последней итерации цикла while (как i == len(toks)-1 и i+1 == len(toks), который выходит за рамки и выдает ошибку). Вы должны изменить эту строку выше:

while(i < len(toks)-1): 

так, что на последней итерации i == len(toks) - 2 и i+1 == len(toks) - 1, которые находятся в пределах.

Смежные вопросы