如何创建类似于符号表的东西

时间:2017-10-11 07:35:45

标签: python lexer

我正在研究一个项目,一个简单的词法分析器。

我必须读取行并存储令牌以及它们在“符号表”中的行。我在如何使用python创建这样的表时遇到了麻烦。

我尝试了以下内容:

class Table:
  def __init__(self):
    self.token = ""
    self.line = []

我需要做些什么来制作类Table()的列表?

例如,如果我读入一个令牌variable,然后另一个令牌variable2,我怎么能创建一个列表,所以我不必继续创建{{1}的实例}?

示例输出:

  

变量是第1行的标识符。

     

variable2是第2行的标识符。

1 个答案:

答案 0 :(得分:1)

标准Python类

在定义任何新类之前,您可以使用现有的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