Токен - это то, что вы хотите.Традиционно (и по понятным причинам) языковые спецификации разбивали анализ на две части: первая часть разбивала входной поток на токены, а вторая анализировала токены.(Теоретически, я думаю, что вы можете написать любую грамматику только на одном уровне, без использования токенов - или, что то же самое, с использованием отдельных символов в качестве токенов. Я не хотел бы видеть результаты этого для языка, подобного C ++,однако.) Но определение того, что такое токен, полностью зависит от языка, который вы анализируете: большинство языков, например, рассматривают пробел как разделитель (но не Фортран);большинство языков предопределяют набор знаков препинания / операторов, использующих знаки пунктуации, и не допускают использование этих символов в символах (но не в языке COBOL, где «abc-def» будет одним символом).В некоторых случаях (в том числе в препроцессоре C ++) токен зависит от контекста, поэтому вам может потребоваться некоторая обратная связь с анализатором.(Надеюсь, что нет; такие вещи предназначены для очень опытных программистов.)
Вероятно, одно можно сказать наверняка (если каждый символ не является токеном): вам придется читать вперед в потоке.Обычно вы не можете определить, есть ли еще токены, просто взглянув на одного персонажа.Обычно я считаю полезным, чтобы токенизатор считывал весь токен за раз и сохранял его до тех пор, пока он не понадобится парсеру.Такая функция, как hasMoreTokens
, на самом деле сканирует полный токен.
(И пока я нахожусь, если source
является istream
: istream::peek
не возвращает указатель, ноint
.)