我正在用 Python 编写一种编程语言,但是词法分析器功能遇到了问题。
我将向您提供功能齐全的代码:
import sys
inputError = """
(!) Error.
(!) Cannot get input.
(!) Please try again.
"""
lexerError = """
(!) Error.
(!) Lexer error. Cannot read input and separate tokens.
(!) Please try again.
"""
def __get_input():
err = False
ipt = None
try:
ipt = input("} ")
err = False
except:
ipt = None
err = True
return err, ipt
def __lexer(ipt):
err = False
digits = "1234567890"
NUM = "DIGIT"
PLUS = "PLUS"
MINUS = "MINUS"
MULTP = "MULTP"
DIV = "DIV"
L_BRK = "L_BRK"
R_BRK = "R_BRK"
token = ""
tokens = []
ttypes = []
try:
for i in range(len(ipt)):
char = ipt[i]
if char==' ':
tokens.append(token)
token = ""
else:
token = token + ipt[i]
tokens.append(token)
for i in range(len(tokens)):
token = tokens[i]
for j in range(len(token)):
if token[j] in digits:
ttypes[i] = DIGITS
else:
ttypes[i] = ''
err = False
except:
tokens = []
ttypes = []
err = True
return err, tokens, ttypes
def __init():
err, ipt = __get_input()
if err==True:
print(inputError)
sys.exit()
err, tokens, ttypes = __lexer(ipt)
if err==True:
print(lexerError)
sys.exit()
print(err, tokens, ttypes)
__init()
我的问题出在第 66-67 行。我期望词法分析器函数(其余函数运行良好)能够读取用户的输入,将其分成标记 - 并且这可以正常工作 - 然后识别标记的类型。我已经定义了所有类型的标记,但是我想从整数类型开始。第for
62 行的循环启动例程来验证标记是否仅包含有效数字,然后将相应的类型分配给数组的当前元素ttypes
。因此在第 67 行,使用 GDB 在线调试器,程序直接跳转到except
,我不知道为什么。当我尝试用一些print()
函数代替ttypes[i] = DIGITS
和ttypes[i] = ''
行时,事情变得更加复杂,因为它按预期工作:如果标记由数字组成,它会打印一些内容,否则它会打印其他内容。
...
for i in range(len(tokens)):
token = tokens[i]
for j in range(len(token)):
if token[j] in digits:
print("It's an integer")
else:
print("It isn't an integer.")
...
我就是这么做的。
希望您能理解我的问题。非常感谢!
此问题与列表的处理有关
ttypes
。您正尝试将值分配给ttypes[i]
,但ttypes
已初始化为空列表。出现此问题的原因是 Python 列表不允许直接分配给不存在的索引。这是一个例子。
因此,当您尝试分配时
ttypes[i] = NUM
(我假设您尝试分配NUM
,而不是DIGITS
),它会引发IndexError
,这就是代码跳转到except
块的原因。请append()
改用函数。这是我的建议。
我希望这会有点帮助。