что именно является токеном, относительно разбора - PullRequest
4 голосов
/ 12 апреля 2011

Мне нужно использовать синтаксический анализатор и средство записи в c ++, я пытаюсь реализовать функции, однако я не понимаю, что такое токен. одна из моих функций / операций состоит в том, чтобы проверить, есть ли еще токены для производства

bool Parser :: hasMoreTokens ()

как мне это сделать, помогите

SO!

Я открываю текстовый файл с текстом в нем, все слова в нижнем регистре. Как мне проверить, есть ли у него больше токенов?

Это то, что у меня есть

bool Parser::hasMoreTokens() {

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

Ответы [ 6 ]

3 голосов
/ 12 апреля 2011

Токены являются выводом лексического анализа и вводом для синтаксического анализа. Обычно это такие вещи, как

  • номер
  • имена переменных
  • Скобки
  • арифметические операторы
  • терминаторы операторов

Это, грубо говоря, самые большие вещи, которые могут быть однозначно идентифицированы кодом, который просто смотрит на его ввод по одному символу за раз.

Одна заметка, которую вы можете игнорировать, если она вас смущает: граница между лексическим анализом и анализом немного размыта. Например:

  1. Некоторые языки программирования имеют литералы комплексных чисел, которые выглядят, скажем, как 2+3i или 3.2e8-17e6i. Если бы вы разбирали такой язык, вы могли бы заставить лексера сжать целое комплексное число и превратить его в токен; или вы могли бы иметь более простой лексер и более сложный парсер и сделать (скажем) 3.2e8, -, 17e6i отдельными токенами; тогда работа парсера (или даже генератора кода) будет заключаться в том, чтобы заметить, что в действительности он представляет собой один литерал.

  2. В некоторых языках программирования лексер не может определить, является ли данный токен именем переменной или именем типа. (Это происходит, например, в Си.) Но грамматика языка может различать два, так что вы хотите, чтобы «переменная foo» и «имя типа foo» были разными токенами. (Это также происходит в C.) В этом случае может потребоваться, чтобы некоторая информация передавалась обратно из синтаксического анализатора в лексер, чтобы в каждом случае он мог создавать правильный вид токена.

Так что "1034 * точно является токеном?" может не всегда иметь четко определенный ответ.

1 голос
/ 12 апреля 2011

Когда вы разбиваете большую единицу (длинную строку) на группу субъединиц (меньшие строки), каждая из субъединиц (меньшая строка) называется «токеном». Если субблоков больше нет, значит, вы закончили анализ.

Как токенизировать строку в C ++?

0 голосов
/ 12 апреля 2011

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

Вероятно, одно можно сказать наверняка (если каждый символ не является токеном): вам придется читать вперед в потоке.Обычно вы не можете определить, есть ли еще токены, просто взглянув на одного персонажа.Обычно я считаю полезным, чтобы токенизатор считывал весь токен за раз и сохранял его до тех пор, пока он не понадобится парсеру.Такая функция, как hasMoreTokens, на самом деле сканирует полный токен.

(И пока я нахожусь, если source является istream: istream::peek не возвращает указатель, ноint.)

0 голосов
/ 12 апреля 2011

Маркер - это терминал в грамматике, последовательность из одного или нескольких символов, которая определяется самой последовательностью, т. Е. Он не является производным от какой-либо другой продукции, определенной в грамматике.

0 голосов
/ 12 апреля 2011

A token - это наименьшая единица языка программирования, которая имеет значение.Круглые скобки (, имя foo, целое число 123 - все это токены.Сокращение текста до серии токенов, как правило, является первым шагом его анализа.

0 голосов
/ 12 апреля 2011

Токен обычно похож на слово на спонкенском языке. В C ++ (int, float, 5.523, const) будут токены. Минимальная единица текста, составляющая семантический элемент.

...