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操作的分離。
我目前正處于一個我自己的項目的開始階段。我想創建一種可擴展的編譯/翻譯語言。語法和語句擴展等應該可以創建。在
問題
你對雷克薩斯的設計有什么看法?你有什么可抱怨的嗎?或者有一個如何改進它,增加更多功能的想法?在
總結
以上是生活随笔為你收集整理的python子类定制_在Python中实现可定制的Lexer类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql optimize 作用_my
- 下一篇: websocket python爬虫_p