Вопрос эффективности токенизатора - PullRequest
4 голосов
/ 19 января 2011

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

1) токенизатор читает все токены:

bool Parser::ReadAllTokens()
{
  Token token;
  while( m_Lexer->ReadToken( &token ) )
  {
    m_Tokens->push_back( token );
    token.Reset(); // reset the token values..
  }

  return !m_Tokens->empty();
}

и затем начинается фаза синтаксического анализа, работающая со списком m_ Tokens.Таким образом, методы getNextToken (), peekNextToken () и ungetToken () относительно легко реализовать с помощью итератора, а код синтаксического анализа хорошо написан и понятен (не нарушается getNextToken (), то есть:

 getNextToken();
 useToken();
 getNextToken();
 peekNextToken();
 if( peeked is something )
  ungetToken();
 ..
 ..

)

2) начинается фаза синтаксического анализа, и когда необходимо, токен создается и используется (код кажется не очень понятным)

Какой метод лучше и почему? Иэффективность ??заранее спасибо за ответы

Ответы [ 4 ]

3 голосов
/ 19 января 2011

Традиционно, классы построения компилятора учат вас читать токены, один за другим, когда вы анализируете.Причина этого в том, что в те времена ресурсы памяти были ограничены.В вашем распоряжении были килобайты, а не гигабайты, как у вас сегодня.

Сказав это, я не хочу рекомендовать вам заранее прочитать все токены, а затем проанализировать их список токенов.Ввод произвольного размера.Если у вас слишком много памяти, система замедлится.Поскольку, похоже, вам нужен только один токен во время просмотра, я буду читать по одному из входного потока.Операционная система будет буферизовать и кэшировать входной поток для вас, поэтому он будет достаточно быстрым для большинства целей.

2 голосов
/ 19 января 2011

Ваш метод (1), как правило, излишний - он не требует токенизации целого файла перед его синтаксическим анализом.

Хороший способ - внедрить буферизованный токенайзер, который будет хранить в списке токены, которые были выкинуты или не найдены, и который будет использовать элемент этого списка при получении или считывать токены из файла, когда список становится пустым (а-ля FILE *).

2 голосов
/ 19 января 2011

Было бы лучше использовать что-то вроде Boost :: Spirit для токенизации.Зачем изобретать велосипед?

1 голос
/ 19 января 2011

Первый способ лучше, так как вы можете также понять код через 3 месяца ...

...