我正在研究一个项目,一个简单的词法分析器。
我必须读取行并存储令牌以及它们在“符号表”中的行。我在如何使用python创建这样的表时遇到了麻烦。
我尝试了以下内容:
class Table:
def __init__(self):
self.token = ""
self.line = []
我需要做些什么来制作类Table()
的列表?
例如,如果我读入一个令牌variable
,然后另一个令牌variable2
,我怎么能创建一个列表,所以我不必继续创建{{1}的实例}?
示例输出:
变量是第1行的标识符。
variable2是第2行的标识符。
答案 0 :(得分:1)
在定义任何新类之前,您可以使用现有的Python类。如果我正确理解您的问题,defaultdict
变量名称作为键和行列表将正常工作:
from collections import defaultdict
table = defaultdict(list)
table['variable1'].append(1)
table['variable2'].append(2)
table['variable1'].append(2)
print(table)
# defaultdict(<class 'list'>, {'variable1': [1, 2], 'variable2': [2]})
对于句子,你可以写:
for variable, lines in table.items():
lines_as_str = ' and '.join('line %d' % line for line in lines)
print("%s is an identifier on %s" % (variable, lines_as_str))
输出:
variable1 is an identifier on line 1 and line 2
variable2 is an identifier on line 2
以下是定义自定义类和对象的方法:
class Token:
def __init__(self, name):
self.name = name
self.lines = []
def add_line(self, line):
self.lines.append(line)
def __str__(self):
lines_as_str = ' and '.join('line %d' % line for line in self.lines)
return "%s is an identifier on %s" % (self.name, lines_as_str)
class Table(dict):
def tokens(self):
return self.values()
def get_token(self, name):
return self.get(name) or self.setdefault(name, Token(name))
def add_token_on_line(self, name, line):
self.get_token(name).add_line(line)
def __str__(self):
return "\n".join(str(token) for token in self.tokens())
table = Table()
table.add_token_on_line('variable1', 1)
table.add_token_on_line('variable2', 1)
table.add_token_on_line('variable1', 3)
print(table)
输出:
variable1 is an identifier on line 1 and line 3
variable2 is an identifier on line 1