词法分析的前奏:字符分析(十二)字符分类源代码

创建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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值