我正在用 Ruby 构建一个词法分析器,并且即将开始在符号表中收集和存储符号。我的主要问题是关于符号的设计以及它是否应该是静态表(意味着所有数据都将保存在类级别)或者它是否应该基于实例。
选项 1:类级数据结构
require 'SymbolTableEntry.rb'
class SymbolTable
@sym_table = Array.new(500)
def initialize()
end
def SymbolTable.add(element, index)
@sym_table[index] = element if element.is_a? SymbolTableEntry
end
def SymbolTable.to_s
pp @sym_table
end
end
使用这种方案,SymbolTable 类具有某种“静态”功能,这意味着我实际上并没有创建 SymbolTable 的实例,唯一存在的对象是类级别的对象。
(假设这SymbolTableEntry
是一个有效的对象,即使我没有在这里定义它)
前任:
irb(main):002:0> require 'SymbolTable.rb'
=> true
irb(main):003:0> ste = SymbolTableEntry.new
=> #<SymbolTableEntry:0x7ef36884>
irb(main):004:0> SymbolTable.add(ste, 10)
=> #<SymbolTableEntry:0x7ef36884>
irb(main):005:0> SymbolTable.to_s
[nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
#<SymbolTableEntry:0x7ef36884>]
=> nil
选项 2:实例级数据结构
require 'rubygems'
require 'backports'
require 'SymbolTableEntry.rb'
class SymbolTable
def initialize()
@sym_table = Array.new(10)
end
def add(element, index)
@sym_table[index] = element if element.is_a? SymbolTableEntry
end
def to_s
pp @sym_table
end
end
使用这种方案,我实际上需要实例化 SymbolTable 类的实例,以便将值添加到符号表中。
irb(main):001:0> require 'SymbolTable.rb'
=> true
irb(main):002:0> st = SymbolTable.new
=> #<SymbolTable:0x7eeb6c9c @sym_table=[nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil]>
irb(main):003:0> ste=SymbolTableEntry.new
=> #<SymbolTableEntry:0x7eeb4d5c>
irb(main):004:0> st.add(ste,10)
=> #<SymbolTableEntry:0x7eeb4d5c>
irb(main):007:0> st.to_s
[nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
#<SymbolTableEntry:0x7eeb4d5c>]
=> nil
我很想听听关于您将使用或更喜欢使用哪种设计的任何和所有意见,以及对 ruby 代码的一般评论。
谢谢