跳转到主要内容

构建简单的基于正则表达式的小语言词法和解析器。从语法构建解析器,并接受Pygments词法分析器作为输入。由NLTK衍生而来。

项目描述

https://github.com/aboutcode-org/pygmars

pygmars是一个简单的词法和解析库,旨在使用正则表达式构建轻量级的词法和解析器。

pygmars允许您构建简单的词法分析器,它基于正则表达式识别单词,并使用轻量级的语法来识别单词序列以获取解析树。

词法分析任务将一系列单词或字符串(例如,已经按单词分割)转换为一系列Token对象,并为每个单词分配标签,同时跟踪其位置和行号。

特别是,词法分析输出设计为与Pygments词法分析器的输出兼容。这使得在现有的Pygments词法分析器之上构建简单的语法成为可能,以对Pygments支持的所有(130多个)编程语言进行轻量级解析。

解析任务将一个序列的标记转换为解析树,其中树中的每个节点都被识别并分配一个标签。解析使用基于正则表达式的语法规则来识别标记序列。

这些规则是按顺序评估的,而不是递归的:这使事情变得简单,并且在实践中效果很好。这种方法和规则语法已经在NLTK中得到了实战测试,pygmars就是从NLTK派生出来的。

那名字呢?

“pygmars”是“Pyg-ments”和“Gram-mars”的组合。

起源

这个库基于NLTK正则表达式POS标记器(重命名为lexer)和正则表达式chunker(重命名为parser)的原始代码进行了大量修改、简化和混搭。NLTK的原设计由@savinosto完成,用于ScanCode Toolkit中的版权声明解析。

用户

pygmars被ScanCode Toolkit用于版权检测和轻量级编程语言解析。

为什么选择pygmars?

为什么要创建这个看似冗余的库?为什么不用NLTK直接使用?

  • NLTK专注于NLP和lexing/tagging,使用正则表达式进行解析只是其功能集的一小部分。这些是丰富的标记器和解析器集合,并实现了一个共同的API。我们没有这些更丰富的API的需求,它们使得API的演变和代码重构变得困难。

  • 特别是NLTK的POS标记和chunking是ScanCode toolkit中用于版权和作者检测的引擎,有一些改进、简化和优化在NLTK中直接实施可能会有困难,并且不太可能被上游接受。例如,用于版权检测的代码子集的简化使性能得到了大幅提升。改进跟踪标记行和位置可能无法在NLTK API中实现。

  • NLTK的新版本有几个额外的必需依赖项,而我们不需要。这使得每个工具在使用这个有限的NLTK子集时都变得更重、更复杂。通过移除未使用的NLTK代码,我们得到了一个小巧且专注的库,没有依赖。

  • ScanCode toolkit还需要轻量级解析几种编程语言以从包清单中提取元数据(如依赖项)。一些解析器是手动构建的(如gemfileparser),或者使用Python ast模块(用于Python setup.py),或者它们使用现有的Pygments lexer作为基础。这个库的目标是能够通过重用Pygments lexer的输出作为语法的输入来构建轻量级解析器。这在目标上与NLP有很大不同。

操作理论

一个pygmars.lex.Lexer创建了一个pygmars.Token对象序列,例如

Token(value="for" label="KEYWORD", start_line=12, pos=4)

其中标签是分配给此标记的符号名称。

标记是一个终端符号,语法由规则组成,其中左侧是一个标签,即非终端符号,右侧是一组标签的正则表达式模式。

参见https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols

一个pygmars.parse.Parser是从一个pygmars.parse.Grammmar构建的,并调用它的parse函数将一个标记序列转换为一个pygmars.tree.Tree解析树。

语法由规则组成,并从每行一个规则的文本文件中加载,如下所示

ASSIGNMENT: {<VARNAME> <EQUAL> <STRING|INT|FLOAT>} # variable assignment

在这里,“ASSIGNMENT”标签是在右侧标记标签序列“<VARNAME> <EQUAL> <STRING|INT|FLOAT>”匹配时产生的。“# variable assignment”是这个规则的解释。

许可证

  • SPDX-License-Identifier: Apache-2.0

基于NLTK(http://nltk.org/)的大量修改的子集

版权(c)nexB Inc.和其他。版权(C)NLTK项目

项目详情


下载文件

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

源分布

pygmars-0.9.0.tar.gz (88.3 kB 查看哈希值)

上传时间

构建分布

pygmars-0.9.0-py3-none-any.whl (28.7 kB 查看哈希值)

上传时间 Python 3

支持者