我必须在c ++中使用解析器和编写器,我正在尝试实现这些功能,但我不明白令牌是什么。我的一个功能/操作是检查是否有更多的令牌产生
bool Parser :: hasMoreTokens()
我究竟是怎么做到的,请帮忙
SO!
我正在打开一个包含文本的文本文件,所有单词都是小写的。我如何检查它是否有更多的东西?
这就是我所拥有的
bool Parser::hasMoreTokens() {
while(source.peek()!=NULL){
return true;
}
return false;
}
答案 0 :(得分:3)
标记是词法分析的输出和解析的输入。通常他们是像
这样的东西粗略地说,大概是可以通过代码明确识别的最大的东西,一次只查看其输入的一个字符。
一个注释,如果它让你感到困惑,你应该随意忽略:词法分析和解析之间的界限有点模糊。例如:
某些编程语言具有复数文字,例如2+3i
或3.2e8-17e6i
。如果你正在解析这样一种语言,你可以让词法分析器吞噬一个完整的复数并将它变成一个标记;或者你可以有一个更简单的词法分析器和一个更复杂的解析器,并使(例如)3.2e8
,-
,17e6i
成为单独的标记;然后,解析器的工作(甚至是代码生成器)会注意到它的内容实际上是单个文字。
在某些编程语言中,词法分析器可能无法判断给定标记是变量名还是类型名。 (例如,这发生在C语言中。)但是语言的语法可以区分两者,因此您希望“变量foo”和“类型名称foo”成为不同的标记。 (这也发生在C中。)在这种情况下,可能需要将一些信息从解析器反馈到词法分析器,以便它可以在每种情况下产生正确类型的令牌。
那么“什么完全是一个令牌?”可能并不总是有一个完美明确的答案。
答案 1 :(得分:1)
将大单元(长字符串)拆分为一组子单元(较小的字符串)时,每个子单元(较小的字符串)称为“标记”。如果没有更多的子单元,那么你就完成了解析。
答案 2 :(得分:0)
令牌通常类似于口语中的单词。在C ++中,(int,float,5.523,const)将是标记。是构成语义元素的最小文本单元。
答案 3 :(得分:0)
令牌是具有意义的编程语言的最小单位。括号(
,名称foo
,整数123
都是标记。将文本缩减为一系列标记通常是解析它的第一步。
答案 4 :(得分:0)
令牌是语法中的终端,是由序列本身定义的一个或多个符号的序列,即它不是从语法中定义的任何其他生成派生的。
答案 5 :(得分:0)
令牌是您想要的任何东西。传统上(和 好的理由),语言规范打破了分析 两部分:第一部分将输入流分解为令牌, 第二个解析了令牌。 (从理论上讲,我认为你 可以只在一个级别编写任何语法,而不使用 令牌 - 或者是同一件事,使用个人 字符作为标记。我不想看到结果 但是对于像C ++这样的语言来说。)但是它的定义 令牌是什么取决于你的语言 解析:大多数语言,例如,将空格视为 分隔符(但不是Fortran);大多数语言都会预定义 一组使用标点字符的标点/运算符,和 不允许符号中的这些字符(但不允许COBOL,其中 " ABC-DEF"将是一个单一的符号)。在某些情况下(包括 在C ++预处理器中,什么是令牌取决于上下文,所以 您可能需要解析器的一些反馈。 (希望不是; 那种事情适合非常有经验的程序员。)
有一件事可能是肯定的(除非每个角色都是一个代币):
你必须在流中预读。你通常不能
通过观察单个来判断是否有更多的令牌
字符。事实上,我发现它通常很有用
tokenizer一次读取整个令牌,并保持它直到
解析器需要它。实际上像hasMoreTokens
这样的函数
扫描完整的令牌。
(虽然我正在考虑,如果source
是istream
:
istream::peek
不返回指针,而是返回int
。)