所以我正在通过 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/