构建简单的基于正则表达式的小语言词法和解析器。从语法构建解析器,并接受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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bc486cb3c4c7a22cc3d86077c51a741d1e2631c4cd409f33484974006063ee09 |
|
MD5 | b7aa2954a06206498c1eb1c47b50f5ce |
|
BLAKE2b-256 | e588e2c36beae2bb7fc42d511be49c6d360054c6a08d401c4b5fb8177c2bb77f |
pygmars-0.9.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0a6919e86bd193fd2a8322957a29d2cf06e8802c7215d74cc2004b6f914d0c56 |
|
MD5 | 5f65cee7da63b019100352415c77a12e |
|
BLAKE2b-256 | 28477586a687f206a302bc388b4e5424a3fa4618cfc99fc59434d1b384620269 |