我正在Ruby中構建一個詞法分析器,並且即將開始在符號表中收集和存儲符號。我關於符號設計的主要問題以及它是否應該是靜態表(意味着所有數據將保持在課程級別),還是應該以實例爲基礎。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
使用這種方案的符號表類有一個排序的「靜態」的功能,這意味着我不實際創建符號表的一個實例,唯一存在的對象是類一級。
(假設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類的實例,以便將值添加到sym bol桌子。
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代碼的任何評論。
感謝
謝謝,這是非常有幫助的。 –
我認爲Singleton絕對是要走的路,因爲我肯定只需要在整個編譯過程中使用SymbolTable的一個實例。謝謝 –
@Hunter,不客氣,謝謝你的提問。 –