Tec*_*upe 5 c++ stream ifstream ostream
我必须在 C++ 中使用解析器和编写器,我正在尝试实现这些功能,但是我不明白令牌是什么。我的功能/操作之一是检查是否有更多令牌要生产
bool Parser::hasMoreTokens()
我到底该怎么做,请帮忙
所以!
我正在打开一个带有文本的文本文件,所有单词都是小写的。我如何去检查它是否有更多令牌?
这就是我所拥有的
bool Parser::hasMoreTokens() {
while(source.peek()!=NULL){
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
标记是词法分析的输出和解析的输入。通常它们是这样的
也就是说,粗略地说,可以通过一次只查看输入一个字符的代码明确识别的最大事物。
一个注释,如果它让您感到困惑,您可以随意忽略它:词法分析和解析之间的界限有点模糊。例如:
一些编程语言有复数文字,看起来像2+3i或3.2e8-17e6i。如果你正在解析这样一种语言,你可以让词法分析器吞噬一个完整的复数并将它变成一个标记;或者你可以有一个简单的词法分析器和更复杂的解析器,使(比方说)3.2e8,-,17e6i是分隔标记; 然后解析器(甚至代码生成器)的工作就是注意到它所得到的实际上是一个单一的文字。
在某些编程语言中,词法分析器可能无法判断给定的标记是变量名还是类型名。(例如,这发生在 C 中。)但是语言的语法可能会区分这两者,因此您希望“变量 foo”和“类型名称 foo”是不同的标记。(这也发生在 C 中。)在这种情况下,可能需要将一些信息从解析器反馈到词法分析器,以便它可以在每种情况下生成正确类型的标记。
那么“到底什么是令牌?” 可能并不总是有一个完美定义的答案。
令牌是您想要的任何东西。传统上(并且有充分的理由),语言规范将分析分为两个部分:第一部分将输入流分解为标记,第二部分解析标记。(理论上,我认为你可以在单个级别中编写任何语法,而不使用标记 - 或者使用单个字符作为标记是同一件事。我不希望看到像 C++ 这样的语言的结果,但是。)但是标记的定义完全取决于您正在解析的语言:例如,大多数语言将空格视为分隔符(但 Fortran 除外);大多数语言将使用标点符号预定义一组标点符号/运算符,并且不允许在符号中使用这些字符(但 COBOL 除外,其中“abc-def”将是单个符号)。在某些情况下(包括在 C++ 预处理器中),什么是标记取决于上下文,因此您可能需要来自解析器的一些反馈。(希望不是;这种事情是为非常有经验的程序员准备的。)
有一点可能是确定的(除非每个字符都是一个标记):您必须在流中提前阅读。您通常无法仅通过查看单个字符来判断是否有更多标记。事实上,我通常发现它很有用,标记生成器一次读取整个标记,并保留它直到解析器需要它。像这样的函数hasMoreTokens实际上会扫描完整的令牌。
(当我这样做时, if sourceis an istream:
istream::peek不返回指针,而是返回一个int。)