2011-04-12 71 views
4

我必须在C++中使用解析器和编写器,我试图实现函数,但我不明白什么是令牌。我的功能/操作的一个是检查,看看是否有更多的标记生产什么是令牌,关于解析

布尔分析器:: hasMoreTokens()

究竟如何我去了解这一点,请大家帮忙

SO!

我打开一个带有文本的文本文件,所有的单词都是小写的。我如何去查看它是否有更多的快餐?

这是我

bool Parser::hasMoreTokens() { 

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

请不要指望堆栈溢出来写你的代码你。特别是如果它是作业(是吗?听起来像是这样)。告诉我们你试过的东西。如果你根本不知道该怎么做,并且(如我猜测的)这是家庭作业,那么你应该问问你的老师/教授/助教,他们可以(例如)指出你的笔记的相关位或教科书。 – 2011-04-12 17:38:22

回答

3

令牌是词法分析的输出和输入到解析。通常他们的东西像

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

也就是说,大致来说,最大的事情,可以清楚地识别通过一次只查看其输入一个字符的代码。

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

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

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

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

0

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

1

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

How do I tokenize a string in C++?

0

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

0

令牌是在一个语法的终端,一个或多个符号(S)由该序列本身定义的序列,即,它不从语法定义的任何其它的生产派生。

0

令牌是你希望它是什么。传统(和 很好的理由),语言规范打破了分析到 两部分:第一部分打破了输入流中令牌, 和第二解析的令牌。 (理论上,我认为你 可以写在任何语法只在一个单一的水平,而不使用 令牌—或同样的事情,使用个人 字符作为标记我不希望看到 的结果。语言如C++,不过),但 定义的标记是什么完全取决于语言你 解析:大多数语言中,例如,把白色空间 分离器(但不是Fortran语言);大多数语言将使用标点符号预定义 一套标点符号/运营商,以及 不允许这些符号字符(但不包括COBOL,其中 “ABC-DEF”将是一个符号)。在某些情况下(包括C++预处理器中的 ),什么是令牌取决于上下文,因此您可能需要解析器的一些反馈。 (但愿不是; 之类的事情是非常有经验的程序员。)

有一两件事是肯定可能(除非每个字符是一个令牌): 你必须预读数据流中。您通常不能通过查看单个 字符来判断是否有更多的令牌。事实上,我一般认为它很有用,因为标记器一次只能读取整个标记,并保留它直到 解析器需要它。像hasMoreTokens这样的功能实际上是 扫描一个完整的标记。

(虽然我在这,如果sourceistreamistream::peek不返回一个指针,而是一个int