一个动态、Python风格的解析模块
项目描述
CodeTalker
CodeTalker刚刚经历了一次重大修订! :D
CodeTalker的目标是在不牺牲性能或灵活性的情况下,快速开发解析器和翻译器。
特性
完全基于Python的语法定义 [示例语法]
快速(Cython化)的标记和解析
…你还需要什么?
以下是过程
- 标记化:
生成标记列表
如果您使用内置的标记,可以获得完整的C性能,如果您需要更多的灵活性,您可以定义自己的标记 - 基于ReToken或StringToken
- 解析:
生成解析树
解析树与您的规则和原始标记完全对应;调用str(tree)返回精确的原始代码。包括空白、注释等。如果您想对代码进行一些自动修改(例如,格式化),但又不想完全删除空白和注释,这一步骤非常完美。
- 抽象语法树:
parsetree -> ast https://docs.pythonlang.cn/library/ast.html
如果您只关心语法 - 空白等不重要。这是编译或某些情况下的内省情况。我已经将Codetalker的AST实现建模在Python之后。Codetalker为您执行ParseTree -> AST转换;您只需告诉它如何根据给定节点的子节点填充您的树。
- 翻译:
一旦获取了抽象语法树(AST),您就想对它做些什么,对吧?最常见的是“遍历树并对每个节点进行操作,具体取决于它的类型”。这就是
Translator
类发挥作用的地方。[查看链接](http://github.com/jabapyth/codetalker/blob/master/codetalker/pgm/translator.py)。它提供了一个简洁的接口,可以系统地翻译AST为任何您想要的格式。[这里是一个例子](http://github.com/jabapyth/codetalker/blob/master/codetalker/contrib/json.py#L39),展示了如何创建和填写一个Translator。
更多详情,请查看我的宣布博客文章:宣布:CodeTalker。
以下是JSON语法
# some custom tokens class SYMBOL(ReToken): rx = re.compile('[{},[\\]:]') class TFN(ReToken): rx = re.compile('true|false|null') # rules (value is the start rule) def value(rule): rule | dict_ | list_ | STRING | TFN | NUMBER rule.pass_single = True def dict_(rule): rule | ('{', [commas((STRING, ':', value))], '}') rule.astAttrs = {'keys': STRING, 'values': value} dict_.astName = 'Dict' def list_(rule): rule | ('[', [commas(_or(dict_, list_, STRING, TFN, NUMBER))], ']') rule.astAttrs = {'values': [dict_, list_, STRING, TFN, NUMBER]} list_.astName = 'List' grammar = Grammar(start=value, tokens=[STRING, NUMBER, NEWLINE, WHITE, SYMBOL, TFN], ignore=[WHITE, NEWLINE], # we don't care about whitespace... ast_tokens=[STRING, TFN, NUMBER]) # tokens we want picked up in the Abstract Syntax Tree
待办事项
修改codetalker以允许流式输入
项目详情
CodeTalker-1.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e9365c16334fb98c5c1e071d90231e26185a867bc48602ae05af9fad74cb9c71 |
|
MD5 | 5941b9c4ceb472ebb4703b7be4167d0c |
|
BLAKE2b-256 | 497692da540652b970af946049b6c48063416b1c0ebb4554de0487b45e77de7b |