就解析而言,究竟什么是令牌?

what exactly is a token, in relation to parsing

本文关键字:什么 令牌 究竟      更新时间:2023-10-16

我必须在c++中使用解析器和编写器,我试图实现这些函数,但我不明白令牌是什么。我的一个函数/操作是检查是否有更多的令牌要生成

bool解析器:hasMoreTokens ()

我到底该怎么做,请帮忙

如此!

我正在打开一个包含文本的文本文件,所有单词都是小写的。我如何检查它是否有更多的令牌?

这是我的

bool Parser::hasMoreTokens() {
while(source.peek()!=NULL){
    return true;
}
    return false;
}

令牌是词法分析的输出和解析的输入。通常是

    数字
  • 变量名
  • 括号
  • 算术运算符
  • 语句结束符

粗略地说,这是代码每次只查看其输入的一个字符就可以明确标识的最大的东西。

有一个注意事项,如果它使您感到困惑,您可以随意忽略它:词法分析和解析之间的边界有点模糊。例如:

  1. 一些编程语言具有复数字面量,例如2+3i3.2e8-17e6i。如果你正在解析这样一种语言,你可以让词法分析器吞下一个完整的复数,并把它变成一个记号;或者您可以使用更简单的词法分析器和更复杂的解析器,并将(例如)3.2e8, -, 17e6i作为单独的令牌;然后解析器的工作(甚至是代码生成器的工作)将注意到它所得到的实际上是一个单一的文字。

  2. 在某些编程语言中,词法分析器可能无法判断给定的令牌是变量名还是类型名。(例如,这发生在C语言中。)但是该语言的语法可能会区分这两者,因此您希望"变量foo"answers"类型名称foo"是不同的标记。(这在c语言中也会发生。)在这种情况下,可能需要将一些信息从解析器反馈给词法分析器,以便它可以在每种情况下生成正确类型的令牌。

所以"到底是一个标记?"可能并不总是有一个完美定义的答案。

标记是您想要的任何内容。传统上(和很好的理由),语言规范将分析分解为分为两部分:第一部分将输入流分解为令牌,第二个程序解析符号。(理论上,我认为你可以写任何语法在一个单一的水平,不使用token或什么是相同的东西,使用individual字符作为标记。我不想看到结果然而,对于像c++这样的语言来说。)但是对于标记是什么完全取决于您使用的语言解析:例如,大多数语言将空格视为分隔符(但不是Fortran);大多数语言都会进行预定义使用标点符号的一组标点/操作符,和不允许在符号中使用这些字符(但不允许在COBOL中使用)"abc-def"将是一个单独的符号)。在某些情况下(包括在c++预处理器中),什么是令牌取决于上下文,所以您可能需要解析器提供一些反馈。(希望不是;这种事情是非常有经验的程序员做的。)

有一件事是肯定的(除非每个字符都是一个记号):你得在小溪里提前读一下。你通常不能通过查看单个标记来判断是否有更多的标记的性格。我发现它很有用,事实上,对于一次读取整个令牌,并保留它直到Parser需要它。事实上,像hasMoreTokens这样的函数扫描一个完整的令牌

(当我在它,如果sourceistream:istream::peek不返回指针,而是一个int)

标记是编程语言中具有意义的最小单位。括号(、名称foo和整数123都是令牌。将文本简化为一系列标记通常是解析文本的第一步。

标记通常类似于口头语言中的单词。在c++中,(int, float, 5.523, const)将是令牌。是构成语义元素的最小文本单元。

当您将一个大单元(长字符串)分成一组子单元(较小的字符串)时,每个子单元(较小的字符串)都被称为一个"令牌"。如果没有更多的子单元,那么您就完成了解析。

如何在c++中标记字符串?

标记是语法中的一个终端,是由序列本身定义的一个或多个符号的序列,即它不派生自语法中定义的任何其他产物。