資源簡介
語義分析(自定的語義規則)代碼python實現。
說明:
1. mktable(previous):創建一張新的符號表,并返回指向新表的指針。參數previous指向先前創建的符號,放在新符號表的表頭。
2. enter(table, name, type, offset):在table指向的符號表中為名字name建立新表項,同時將類型type及相對地址offset放入該表項的屬性域中。
3. addwidth(table, width):將table指向的符號表中所有表項的寬度之和記錄在與符號表關聯的表頭中。
4. enterproc(table, name, newtable):在table指向的符號表中為過程name建立一個新表項,參數newtable指向過程name的符號表。
代碼片段和文件信息
‘‘‘
語義分析——符號表信息登錄?
python?3.6.1
‘‘‘
import?collections
class?s:
????‘‘‘
????詞法分析輸出的對象
????‘‘‘
????def?__init__(self?strs?state):
????????self.strname?=?strs
????????self.state?=?state
class?lexer:
????‘‘‘
????詞法分析
????‘‘‘
????resword?=?{‘real‘:?‘4‘?‘integer‘:?‘5‘?‘ptr‘:?‘6‘}
????def?__init__(self?strs):
????????self.strings?=?strs
????????self.state?=?-1
????????self.stritemList?=?[]
????def?convert(self):
????????strLength?=?len(self.strings)
????????i?=?0
????????string?=?‘‘
????????while?i?????????????ch?=?self.strings[i]
????????????i?+=?1
????????????if?self.state?==?-1:
????????????????if?ch.isalpha():
????????????????????self.state?=?1
????????????????????string?=?ch
????????????????elif?ch.isspace():
????????????????????self.state?=?-1
????????????????elif?ch?==?‘:‘:
????????????????????self.state?=?2
????????????????????self.stritemList.append(s(ch?self.state))
????????????????????self.state?=?-1
????????????????elif?ch?==?‘;‘:
????????????????????self.state?=?3
????????????????????self.stritemList.append(s(ch?self.state))
????????????????????self.state?=?-1
????????????????elif?ch?==?‘#‘:
????????????????????self.state?=?0
????????????????????self.stritemList.append(s(ch?self.state))
????????????????????self.state?=?-1
????????????????else:
????????????????????strItem?=?ch?+?‘字符不可識別‘
????????????????????self.state?=?-1
????????????elif?self.state?==?1:
????????????????if?ch.isalpha()?or?ch.isdigit():
????????????????????string?+=?ch
????????????????????self.state?=?1
????????????????else:
????????????????????if?string?in?self.resword.keys():
????????????????????????self.state?=?self.resword.get(string)
????????????????????strItem?=?string
????????????????????self.stritemList.append(s(strItem?self.state))
????????????????????string?=?‘‘
????????????????????self.state?=?-1
????????????????????i?-=?1
????def?getstritemList(self):
????????return?self.stritemList
class?stitem:
????‘‘‘
????符號表的表項
????‘‘‘
????def?__init__(self?name?typename?offset):
????????self.name?=?name
????????self.typename?=?typename
????????self.offset?=?offset
class?tbl:
????‘‘‘
????符號表
????‘‘‘
????tbl?=?collections.OrderedDict()??#?有序字典
????def?__init__(self?width=None):
????????self.width?=?width
????def?pop(self):??#?棧的pop操作
????????popitem?=?self.tbl.popitem()
????????return?popitem
????def?push(self?item):??#?棧的push操作
????????self.tbl[item.name]?=?item
def?mktable(previous):
????‘‘‘
????創建一張新的符號表,并返回指向新表的指針。參數previous指向先前創建的符號,放在新符號表的表頭。
????‘‘‘
????table?=?tbl()
????if?previous.name?==?‘‘:
????????return?table
????else:
????????table.push(pr
評論
共有 條評論