6

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

布尔解析器::hasMoreTokens()

我该怎么做呢,请帮忙

所以!

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

这就是我所拥有的

bool Parser::hasMoreTokens() {

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

6 回答 6

6

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

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

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

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

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

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

那么“到底什么是令牌?” 可能并不总是有一个完美定义的答案。

于 2011-04-12T17:28:34.013 回答
3

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

One thing is probably sure (unless each character is a token): you'll have to read ahead in the stream. You typically can't tell whether there are more tokens by just looking at a single character. I've generally found it useful, in fact, for the tokenizer to read a whole token at a time, and keep it until the parser needs it. A function like hasMoreTokens would in fact scan a complete token.

(And while I'm at it, if source is an istream: istream::peek does not return a pointer, but an int.)

于 2011-04-12T18:12:56.003 回答
2

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

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

于 2011-04-12T17:27:50.110 回答
2

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

于 2011-04-12T17:28:42.080 回答
1

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

于 2011-04-12T17:27:35.710 回答
0

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

于 2011-04-12T17:30:28.003 回答