python - Lepl 中的 Token() 对象

标签 python parsing lepl

所以我正在通过 Lepl tutorial ,一个 Python 解析器,我不太清楚 Token(Real())Real() 之间到底有什么区别。我找到了有关该函数的文档,但它们毫无用处。

那么,Token() 类到底做了什么?为什么它与常规 Lepl 类(class)不同?

最佳答案

通常,LEPL 对输入中的字符流进行操作。这很简单,但正如您所见,您需要忽略许多冗余规则,例如合法但被忽略的空格。

这个问题有一个通用的解决方案,即首先通过一个相对简单的自动机运行输入字符串,该自动机会处理这个问题和其他问题。它将输入分成几部分(例如数字、标识符、运算符等)并去除忽略的部分(例如注释和空格)。这使得解析器的其余部分更简单,但是 LEPL 的默认模型没有这个自动机的位置,顺便说一句,它被称为 tokenizer 或词法分析器(简称 lexer)。

每种 token 通常定义为一个正则表达式,描述每个 token 中包含的内容,例如[+-][0-9]+ 用于整数。您可以(有时应该)使用 Token() 来做到这一点,例如Token('a+b+') 提供了一个解析器,该解析器消耗与正则表达式匹配一样多的输入,然后将其作为单个字符串返回。在大多数情况下,这些解析器的工作方式与所有其他解析器一样,最重要的是,它们可以以相同的方式组合。例如,Token('a+') & Token('b+') 的工作原理和前面的一样,只是它产生两个 字符串,而 Token( 'a+') + Token('b+') 完全等价。到目前为止,它们只是一些语法的一些基本构建 block 的较短符号。您还可以将 一些 LEPL 类与 Token() 一起使用,将其转换为等效的正则表达式并将其用作标记 - 例如Token(Literal('ab+'))Token(r'ab\+')

一个重要的区别和巨大的优势是,使用标记,您还可以提供一些模式,如果没有其他匹配的标记,则可以丢弃并丢弃一些输入——默认丢弃空白,这使得忽略空白变得非常容易(虽然仍然允许解析器在某些地方需要空格)。缺点是如果不能自动转换,您必须将所有非 token 匹配器包装在 token 中或手动编写等效规则。

关于python - Lepl 中的 Token() 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6734487/

相关文章:

python - 如何使用 Python Lepl 解析领域特定语言的子集?

python - 将 RGB 视频转换为灰度视频以减小文件大小

java - 使用 SimpleXml 将 Xml 解析为 Java

python - scipy.spatial 的简单 2D 凸包错误

java - 解析文本以查找地理名称

list - 使用 "read"解析字符串并忽略包 namespace

python - 解析重复字符

Python2 : List splitting syntax - tail of a list

python - Django 中同一模型的 UpdateView 的不同模板