跳转到主要内容

一个动态、Python风格的解析模块

项目描述

CodeTalker

https://travis-ci.org/jabapyth/codetalker.png?branch=master

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 (98.6 kB 查看哈希值)

上传时间 源代码

由以下支持