【问题标题】:what exactly is a token, in relation to parsing与解析有关的令牌到底是什么
【发布时间】:2011-08-04 02:16:51
【问题描述】:

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

bool Parser::hasMoreTokens()

我该怎么做呢,请帮忙

所以!

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

这就是我所拥有的

bool Parser::hasMoreTokens() {

while(source.peek()!=NULL){
    return true;
}
    return false;
}

【问题讨论】:

  • 请不要指望 Stack Overflow 会为您编写代码。特别是如果它用于家庭作业(是吗?听起来像)。向我们展示您的尝试。如果您根本不知道该做什么,并且如果(正如我猜测的那样)这是家庭作业,那么您可能应该问您的老师/教授/助教,他们可以(例如)指出您笔记的相关部分或教科书。

标签: c++ stream ifstream ostream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    How do I tokenize a string in C++?

    【讨论】:

      【解决方案3】:

      标记是词法分析的输出和解析的输入。通常它们是这样的

      • 数字
      • 变量名
      • 括号
      • 算术运算符
      • 语句终止符

      也就是说,粗略地说,可以通过一次只查看其输入一个字符的代码明确识别的最大事物。

      如果你感到困惑,你可以忽略它:词法分析和解析之间的界限有点​​模糊。例如:

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

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

      那么“究竟是什么?”可能并不总是有一个完美定义的答案。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            令牌是你想要的任何东西。传统上(并且对于 充分的理由),语言规范将分析分解为 两部分:第一部分将输入流分解为标记, 第二个解析令牌。 (理论上,我认为你 可以仅在一个级别中编写任何语法,而无需使用 代币——或者是同一个东西,使用单独的 字符作为标记。我不想看到结果 但是,对于像 C++ 这样的语言。)但是 令牌是什么完全取决于您使用的语言 解析:例如,大多数语言将空格视为 分隔符(但不是 Fortran);大多数语言都会预先定义 一组使用标点符号的标点符号/运算符,以及 不允许在符号中使用这些字符(但不允许 COBOL,其中 “abc-def”将是一个符号)。在某些情况下(包括 在 C++ 预处理器中),什么是令牌取决于上下文,所以 您可能需要解析器的一些反馈。 (希望不会; 这种东西适合非常有经验的程序员。)

            有一件事可能是肯定的(除非每个字符都是一个标记): 您必须在流中提前阅读。你通常不能 只看一个就知道是否有更多的令牌 特点。事实上,我通常发现它很有用 标记器一次读取整个标记,并保留它直到 解析器需要它。像hasMoreTokens 这样的函数实际上会 扫描一个完整的令牌。

            (当我这样做时,如果sourceistreamistream::peek 不返回指针,而是返回 int。)

            【讨论】:

              猜你喜欢
              • 2011-10-16
              • 1970-01-01
              • 2023-04-08
              • 1970-01-01
              • 2018-08-11
              • 2010-10-21
              • 2013-07-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多