跳转到主要内容

Python 3.6+的语法、解析器和编译器

项目描述

简单的Python编译器,用于娱乐和盈利。

本项目包含的语法示例

如果您想重用示例代码,请随意将代码复制到您的项目中,但不要将示例代码作为依赖引入,因为示例代码可能会被修改或删除而不另行通知。仅通过扩展shreducer包中提供的类来构建您自己的语法和相关类。

  • Python 3.6+类型提示字符串表示

  • Web API的过滤表达式。允许解析如下表达式: https://your.api?filter=(status eq open and type eq store) or (status eq closed and type not in office, garage)

  • 包含Elasticsearch查询编译器(自2016年以来未测试)

  • 一些基本算术表达式的原始语法作为示例

组件

  • 分词器(无需自行实现,我们依赖于Python标准库中的shlex

  • 语法

  • 解析器(无需自行实现,我们使用移位-归约解析器,因此项目名称为shreducer)

  • 生成器

分词器将输入字符串分割成语法的词素单元(我们在这里称它们为标记)。

语法描述了我们想要解析的语言的语法规则。

解析器解析标记序列并生成解析树。例如('+', 2, ('-', 10, 3))可能是一个解析树。

生成器接收一个解析树并对其进行评估。例如,一个算术生成器可以接收一个解析树('+', 2, ('-', 10, 3))作为输入,并产生9作为输出。

所有这些组件共同构成一个编译器。

表达新的语法

请参阅shreducer_examples/下的示例

  • DictG - 所有语法中最简单的一种,最适合理解基本概念,解析器生成解析字典

  • ListG - 另一种简单的语法,但与字典语法不同,这种语法解析器的输出是解析树

  • PlusMinusArithmeticsG - 简单的算术表达式解析器,解析器生成解析树

  • BetterArithmeticsG - 遵守操作符优先级的算术表达式解析器,解析器生成解析树

  • FilterExpressionsG - 比较运算符和逻辑运算符,解析器生成解析树

  • BetterFiltersG - 比较丰富的过滤表达式语言,与其它语法不同,这个语法使用前瞻,解析器生成解析树

  • TypeHintsG - 解析 Python 3.6+ 类型提示字符串表示形式

t类中存在一些魔法(一个元类),允许声明一个字符串常量而无需将其值写两次

class MyGrammar(Grammar):
    class t:
        IDENT = None
        PLUS_MINUS = '+-'
        EXPR = ()

创建MyGrammar类后,MyGrammar.t.IDENT的值将是"IDENT"。同样,MyGrammar.t.PLUS_MINUS将是"PLUS_MINUS",而MyGrammar.t.EXPR将是"EXPR"

class t的成员值为None时被视为默认令牌类型。

class t的成员值为()时被视为高级令牌(表达式)的名称。

测试您的新的语法

如果您只实现了一个语法,您可以使用Grammar.simple_parse(这是一个类方法)尝试解析输入字符串。

例如,要尝试TypeHintsG(Python 3.6+ 类型提示字符串表示形式的语法),您可以这样做

print(TypeHintsG.simple_parse('typing.Union[typing.List[str], typing.Dict[str, int]]'))

这将产生以下解析树

{
    "name": "typing.Union",
    "args": [
        {
            "name": "typing.List",
            "args": [
                {"name": "str", "args": None},
            ],
        },
        {
            "name": "typing.Dict",
            "args": [
                {"name": "str", "args": None},
                {"name": "int", "args": None},
            ],
        },
    ],
}

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

shreducer-1.0.1.tar.gz (18.7 kB 查看哈希)

构建分发

shreducer-1.0.1-py3-none-any.whl (39.7 kB 查看哈希)

Python 3

支持者