一个通用的基于模式的 Lexer/tokenizer 工具。
项目描述
通用词法分析器
一个通用的基于模式的 Lexer/tokenizer 工具。
最低python版本是3.6
- 原作者
- Eli Bendersky的 这个要点最后一次修改于 2010/08
- 维护者
- Leandro Benedet Garcia最后一次修改于 2020/11
- 版本
- 1.1.0
- 执照
- 无牌
- 文档
- 文档可以在 这里找到
例子
如果我们尝试执行以下代码:
from generic_lexer import Lexer
rules = {
"VARIABLE": r"(?P<var_name>[a-z_]+): (?P<var_type>[A-Z]\w+)",
"EQUALS": r"=",
"SPACE": r" ",
"STRING": r"\".*\"",
}
data = "first_word: String = \"Hello\""
data = data.strip()
for curr_token in Lexer(rules, False, data):
print(curr_token)
会给我们以下输出:
VARIABLE({'var_name': 'first_word', 'var_type': 'String'}) at 0
SPACE( ) at 18
EQUALS(=) at 19
SPACE( ) at 20
STRING("Hello") at 21
正如您所看到的与原始要点不同,我们能够为每个令牌指定多个组。您不能使用同一组两次,无论是否每个标记,因为所有正则表达式模式都合并在一起以稍后生成标记。
您可以通过以下方式获取令牌的值:
>>> from generic_lexer import Lexer
>>> rules = {
... "VARIABLE": r"(?P<var_name>[a-z_]+): (?P<var_type>[A-Z]\w+)",
... "EQUALS": r"=",
... "STRING": r"\".*\"",
... }
>>> data = "first_word: String = \"Hello\""
>>> variable, equals, string = tuple(Lexer(rules, True, data))
>>> variable
VARIABLE({'var_name': 'first_word', 'var_type': 'String'}) at 0
>>> variable.val
{'var_name': 'first_word', 'var_type': 'String'}
>>> variable["var_name"]
'first_word'
>>> variable["var_type"]
'String'
>>> equals
EQUALS(=) at 19
>>> equals.val
'='
>>> string
STRING("Hello") at 21
>>> string.val
'"Hello"'