令牌是您想要的任何东西。传统上(并且有充分的理由),语言规范将分析分为两部分:第一部分将输入流分解为标记,第二部分解析标记。(理论上,我认为您可以只在一个级别中编写任何语法,而无需使用标记——或者相同的东西,使用单个字符作为标记。我不希望看到像 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
.)