创建B类字符字典
此处只是将B类字符表文件转换为数据结构,数据结构采用的是Python语言中的字典结构,其特性与C++语言中的MAP数据结构有些类似。以下是源代码:
# -*- coding: utf-8 -*-
"""
9月7日 02:30:01 2021
@author: 刘京
"""
import re
模板 = re.compile("<(.*)>→(.*)")
def 取GB字节数(待求字符):
x = 待求字符.encode('GB18030')
y = list(x)
return len(y)
def 取UTF8字节数(待求字符):
x = 待求字符.encode('utf-8')
y = list(x)
return len(y)
def 取GB字符码(待求字符):
x = 待求字符.encode('GB18030')
y = list(x)
return tuple(y)
def 取UTF8字符码(待求字符):
x = 待求字符.encode('utf-8')
y = list(x)
return tuple(y)
B类字符文件名 = "B类字符表无数字版.txt"
#行数 = 1
B类字符分类码字典 = {
'B类通用字符':1000,
'运算字符':1500,
'界符字符':2600,
'数字字符':2000,
'不可见界符':2500}
B类GB单字节字典 = {}
B类GB多字节字典 = {}
B类UTF8单字节字典 = {}
B类UTF8多字节字典 = {}
def 生成B类字符GB字典():
B类字符文件 = open(B类字符文件名)
while True:
每一行 = B类字符文件.readline()
if 每一行 == "":
break
行分类描述 = 模板.match(每一行)
类型名 = 行分类描述.group(1)
类型码 = B类字符分类码字典[类型名]
类型值 = 行分类描述.group(2)
字节数 = 取GB字节数(类型值)
类型值键 = 取GB字符码(类型值)
if 字节数 == 1:
B类GB单字节字典[类型值键] = 类型码
else:
B类GB多字节字典[类型值键] = 类型码
B类字符文件.close()
def 生成B类字符UTF8字典():
B类字符文件 = open(B类字符文件名)
while True:
每一行 = B类字符文件.readline()
if 每一行 == "":
break
行分类描述 = 模板.match(每一行)
类型名 = 行分类描述.group(1)
类型码 = B类字符分类码字典[类型名]
类型值 = 行分类描述.group(2)
字节数 = 取UTF8字节数(类型值)
类型值键 = 取UTF8字符码(类型值)
if 字节数 == 1:
B类UTF8单字节字典[类型值键] = 类型码
else:
B类UTF8多字节字典[类型值键] = 类型码
B类字符文件.close()
生成B类字符GB字典()
生成B类字符UTF8字典()
字符分类函数
将字符码分为A类和B类,B类字符中包含不可见界符字符和数字字符的相关逻辑。
# -*- coding: utf-8 -*-
"""
Created on 9月16日 02:58:39 2021
@author: 刘京
"""
from 创建B类字符字典 import *
生成B类字符GB字典()
生成B类字符UTF8字典()
def GB字符分类函数(字符元组值):
n = len(字符元组值)
返回值 = 0
if n == 1:
x = 字符元组值[0]
if x <= 32:
返回值 = 2500
elif x >= 48 and x <= 57 :
返回值 = 2000
elif 字符元组值 in B类GB单字节字典 :
返回值 = B类GB单字节字典.get(字符元组值)
else:
返回值 = 100
elif n > 1 :
if 字符元组值 in B类GB多字节字典 :
返回值 = B类GB多字节字典.get(字符元组值)
else:
返回值 = 100
return 返回值
def UTF8字符分类函数(字符元组值):
n = len(字符元组值)
返回值 = 0
if n == 1:
x = 字符元组值[0]
if x <= 32:
返回值 = 2500
elif x >= 48 and x <= 57 :
返回值 = 2000
elif 字符元组值 in B类UTF8单字节字典 :
返回值 = B类UTF8单字节字典.get(字符元组值)
else:
返回值 = 100
elif n > 1 :
if 字符元组值 in B类UTF8多字节字典 :
返回值 = B类UTF8多字节字典.get(字符元组值)
else:
返回值 = 100
return 返回值
完备的字符元素类定义
GB18030字符元素类
from 共享消息与行列号之类定义 import 共享行列号类
from 字符分类函数 import GB字符分类函数
class 字符元素类:
def __init__(self,全局共享行列号):
self.全局行列号 = 全局共享行列号
self.元素值 = []
self.私有行列号 = 共享行列号类()
self.字符有效标志 = False
self.字符分类值 = 0
def __内部行列号处理(self):
行号 = self.全局行列号.读取行号值()
列号 = self.全局行列号.读取列号值()
self.全局行列号.设定列号值( 列号 + 1 )
self.私有行列号.设定行号值( 行号 )
self.私有行列号.设定列号值( 列号 + 1 )
def __内部字符分类(self):
x = tuple(self.元素值)
self.字符分类值 = GB字符分类函数(x)
def 占用字节数(self):
return len(self.元素值)
def 追加一字节垃圾值(self,字节值):
self.元素值.clear()
self.元素值.append(字节值)
self.字符有效标志 = False
self.__内部行列号处理()
def 追加1字节(self,字节值):
self.元素值.clear()
self.元素值.append(字节值)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 追加2字节(self,字节值1,字节值2):
self.元素值.clear()
self.元素值.append(字节值1)
self.元素值.append(字节值2)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 追加4字节(self,字节值1,字节值2,字节值3,字节值4):
self.元素值.clear()
self.元素值.append(字节值1)
self.元素值.append(字节值2)
self.元素值.append(字节值3)
self.元素值.append(字节值4)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 字符有效(self):
return self.字符有效标志
def 读元素值(self,索引值 = 0):
if 索引值 < self.占用字节数():
return self.元素值[索引值]
else:
return None
def 显示字符(self):
if self.字符有效标志:
h = bytes(self.元素值)
字符值 = h.decode('GB18030')
return 字符值
else:
return None
class 空字符元素类():
def __init__(self,全局共享行列号 = 共享行列号类()):
self.全局行列号 = 全局共享行列号
self.元素值 = []
self.私有行列号 = 共享行列号类()
self.字符有效标志 = True
self.字符分类值 = 0
def 占用字节数(self):
return len(self.元素值)
def 字符有效(self):
return self.字符有效标志
def 读元素值(self):
return None
UTF8字符元素类
#字符元素类定义
from 共享消息与行列号之类定义 import 共享行列号类
from 字符分类函数 import UTF8字符分类函数
class 字符元素类:
def __init__(self,全局共享行列号):
self.全局行列号 = 全局共享行列号
self.元素值 = []
self.私有行列号 = 共享行列号类()
self.字符有效标志 = False
self.字符分类值 = 0
def __内部行列号处理(self):
行号 = self.全局行列号.读取行号值()
列号 = self.全局行列号.读取列号值()
self.全局行列号.设定列号值( 列号 + 1 )
self.私有行列号.设定行号值( 行号 )
self.私有行列号.设定列号值( 列号 + 1 )
def __内部字符分类(self):
x = tuple(self.元素值)
self.字符分类值 = UTF8字符分类函数(x)
def 占用字节数(self):
return len(self.元素值)
def 追加一字节垃圾值(self,字节值):
self.元素值.clear()
self.元素值.append(字节值)
self.字符有效标志 = False
self.__内部行列号处理()
def 追加1字节(self,字节值):
self.元素值.clear()
self.元素值.append(字节值)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 追加2字节(self,字节值1,字节值2):
self.元素值.clear()
self.元素值.append(字节值1)
self.元素值.append(字节值2)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 追加3字节(self,字节值1,字节值2,字节值3):
self.元素值.clear()
self.元素值.append(字节值1)
self.元素值.append(字节值2)
self.元素值.append(字节值3)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 追加4字节(self,字节值1,字节值2,字节值3,字节值4):
self.元素值.clear()
self.元素值.append(字节值1)
self.元素值.append(字节值2)
self.元素值.append(字节值3)
self.元素值.append(字节值4)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 追加5字节(self,字节值1,字节值2,字节值3,字节值4,字节值5):
self.元素值.clear()
self.元素值.append(字节值1)
self.元素值.append(字节值2)
self.元素值.append(字节值3)
self.元素值.append(字节值4)
self.元素值.append(字节值5)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 追加6字节(self,字节值1,字节值2,字节值3,字节值4,字节值5,字节值6):
self.元素值.clear()
self.元素值.append(字节值1)
self.元素值.append(字节值2)
self.元素值.append(字节值3)
self.元素值.append(字节值4)
self.元素值.append(字节值5)
self.元素值.append(字节值6)
self.字符有效标志 = True
self.__内部行列号处理()
self.__内部字符分类()
def 字符有效(self):
return self.字符有效标志
def 读元素值(self,索引值 = 0):
if 索引值 < self.占用字节数():
return self.元素值[索引值]
else:
return None
def 显示字符(self):
if self.字符有效标志:
h = bytes(self.元素值)
字符值 = h.decode('utf-8')
return 字符值
else:
return None
class 空字符元素类():
def __init__(self,全局共享行列号 = 共享行列号类()):
self.全局行列号 = 全局共享行列号
self.元素值 = []
self.私有行列号 = 共享行列号类()
self.字符有效标志 = True
self.字符分类值 = 0
def 占用字节数(self):
return len(self.元素值)
def 字符有效(self):
return self.字符有效标志
def 读元素值(self):
return None
可能细心的读者已经发现,这一版的字符元素类定义与前面的有所不同,实际上在添加字符分类函数这个功能时,我发现以前那个版本的所有类定义,相互间的耦合太严重了,忍无可忍,我把它们全重构了一遍。并且,为了方便后续的词法分析,特意添加了一个空字符元素类,其特点是字符分类值始终为0,字符元素值始终为None。