python子类定制_在Python中实现可定制的Lexer类

我想实现一个可定制和可扩展的lexer类。在

我的想法

2种不同类型的处理程序:字符集处理程序

函数处理程序

当一个字符被读取时,它被推送到所有注册到lexer的处理程序中。一旦处理程序匹配并返回一个有效的令牌,它就会被返回。如果没有处理程序与字符匹配,则调用一个最坏情况函数,如果该函数没有返回有效的标记,则读取下一个字符并递归执行。在

字符集处理程序由一个字符串和一个接受三个参数的函数组成。字符串表示一组字符,当当前解析的字符包含在该字符串中时,这些字符将导致调用该函数。当函数无法创建以下字符的标记时,它可能返回None。函数必须将正在读取的所有字符推回,以便在无法处理的情况下创建令牌。下一次调用scanner.read_next_char()时,将返回被推回扫描仪的字符,这样就可以像函数从未接触过扫描仪一样读取输入字节流。在

函数处理程序是一个包含三个参数的函数,如果它不能用调用处理程序的字符后面的字符创建有效的令牌或None,就像上面与字符集相关联的函数一样。在

当没有处理程序可以从当前及其后的字符创建有效的令牌并遵循上述模式时,调用最坏情况函数。在

每个处理程序都有三个参数,lexer使用的扫描器本身、lexer使用的扫描器以及实际调用处理程序的当前字符。在

Lexer本身和处理程序是分开的。在class LexingRules(object):

def __init__(self):

self.charset_handlers = []

self.function_handlers = []

self.worst_case = None

# convenient methods for adding handlers

class Lexer(object):

def __init__(self, scanner, rules):

self.scanner = scanner

self.rules = rules

self.current_token = None

self.read_next_token()

def read_next_token(self):

current_char = self.scanner.current_char

for charset, handler in self.rules.charset_handlers:

if current_char in charset:

token = handler(self, self.scanner, current_char)

if isinstance(token, Token):

self.current_token = token

return token

for function in self.rules.function_handlers:

token = function(self, self.scanner, current_char)

if isinstance(token, Token):

self.current_token = token

return token

if self.rules.worst_case:

token = self.rules.worst_case(self, self.scanner, current_char)

if isinstance(token, Token):

self.current_token = token

return token

self.scanner.read()

return self.read_next_token()

一个可能的LexingRules子类

^{pr2}$

目标

基本Lexer实现和硬编码Lexing操作的分离。

我目前正处于一个我自己的项目的开始阶段。我想创建一种可扩展的编译/翻译语言。语法和语句扩展等应该可以创建。在

问题

你对雷克萨斯的设计有什么看法?你有什么可抱怨的吗?或者有一个如何改进它,增加更多功能的想法?在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值