python 3.6中的语法、语法分析器和编译器+

shreducer的Python项目详细描述


简单的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年起未测试)
  • 基本算术表达式的两个基本语法示例

部件

  • tokenizers(不需要实现您自己的,我们依赖python标准库中的shlex
  • 语法
  • parsers(不需要实现自己的解析器,我们使用shift reduce解析器,因此是项目名称)
  • 发电机
1,将输入字符串拆分为语法的词汇单位(这里我们称之为记号)。

grammar描述要分析的语言的语法规则。

parser分析令牌序列并生成一个解析树。 例如('+', 2, ('-', 10, 3))可以是解析树。

generator获取一个解析树并对其求值。例如,算术生成器可以 解析树('+', 2, ('-', 10, 3))作为输入,并生成9作为输出。

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

表达新语法

请参阅shreducer_examples/

下的示例
  • DictG-所有语法中最简单的,最适合理解基本思想的,解析器生成解析字典
  • ListG-另一个简单语法,但与字典语法不同,这个语法的解析器生成解析树
  • PlusMinusArithmeticsG-简单算术表达式解析器,解析器生成解析树
  • BetterArithmeticsG-算术表达式解析器,它尊重运算符优先级,解析器生成解析树
  • FilterExpressionsG-比较运算符和逻辑运算符,解析器生成解析树
  • BetterFiltersG-相对丰富的过滤表达式语言,与此语言使用的其他语法不同, Parser生成分析树
  • TypeHintsG-分析python 3.6+类型提示字符串表示法

t类中有一些魔术(一个元类)正在进行,以允许 声明字符串常量而不将其值写入两次:

classMyGrammar(Grammar):classt:IDENT=NonePLUS_MINUS='+-'EXPR=()

创建类MyGrammar后,MyGrammar.t.IDENT的值将为"IDENT"。 类似地,MyGrammar.t.PLUS_MINUS将是"PLUS_MINUS",而MyGrammar.t.EXPR将是"EXPR"

值为Noneclass t的成员被视为默认令牌类型。

值为()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},],},],}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java返回调用函数中的更新值   java如何停止小程序中计数变量的错误递增?   java Firebase数据库如何从1引用和等于2引用中获取一些值以获取其键和值   用于从SD卡获取图像的java FileNotFoundException   带有扫描仪的Java应用程序中出现字符串错误。Next()与NextLine()以及为什么我会出错?   java刷新JTable,以便显示插入的数据   java IE不支持通过JSF Trinidad的SVG查看器   Java USB游戏控制器库   java JSON解析错误:无法构造实体类的实例   web服务java。lang.NoClassDefFoundError:com/sun/tools/javac/Main SOAP UI   C++调用GetFieldID在JNI中恢复自定义java类成员ID时,陷入了奇怪的崩溃   java JavaFX从gui接收事件后返回主线程   java将模拟注入Spring测试Mockito+Spring+TestNG   java如何调用ArrayList中的每个数组并按年龄对ArrayList进行排序?