Как это сделать? - PullRequest
       17

Как это сделать?

0 голосов
/ 04 ноября 2011

Я пытаюсь передать код токенизатора.Я продолжаю читать символы, которые могут быть частью токена.Например, целое число может содержать только цифры.Поэтому в тексте ниже я продолжаю читать символы, пока не найду нецифровый символ.Таким образом, я получаю 123 в качестве токена.Затем я получаю (в качестве токена, а затем abc в качестве идентификатора. Это нормально, поскольку (является разделителем.

123(abc

Однако, в приведенном ниже тексте я получаю 123 как целое число, а затем abc как идентификатор. Нона самом деле это недопустимо, поскольку между ними нет разделителя.

123abc(

Должен ли токенизатор проверять разделители и сообщать об ошибке? Если да, то какие токены следует возвращать и откуда токенайзер должен продолжить чтение посленайден неверный токен?

Или токенизатор должен просто возвращать 123 как целое число и abc как идентификатор и позволить анализатору обнаруживать ошибки?

Ответы [ 4 ]

1 голос
/ 04 ноября 2011

Обычно токенизатор (или лексер ) не проверяет действительный синтаксис.

Роль лексера заключается в разделении входных данных на токены, которые затем можно преобразовать всинтаксическое дерево синтаксическим анализатором .Поэтому, как правило, парсер выполняет такую ​​проверку.

0 голосов
/ 04 ноября 2011

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

Есть несколько способов сделать это:

  • Вы можете прервать синтаксический анализ и просто вызвать какое-то исключение,оставив вызывающего абонента без токенов или только токенов, которые вы успешно проанализировали до того времени.Это избавит вас от любой логики «восстановления» и может быть достаточно для вашего варианта использования.Хотя, если вы разбираете вещи для подсветки синтаксиса, например, этого, вероятно, будет недостаточно, так как вы не хотите, чтобы весь оставшийся код выглядел не разбранным.

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

  • В качестве альтернативы, вы можете вставить токен «ошибки» с правильными метаданными о природеошибки и перейдите к следующему действительному токену.

    Возможно, вам понадобится эвристика в лексере, чтобы корректно обработать токен ошибки и найти способ интерпретировать дальнейшие токены, когда токен ошибки найден во вложенном выражении (например, если вы считаете, что выражение закончилось (ищите закрывающий токен? и т. д.).

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

0 голосов
/ 04 ноября 2011

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

0 голосов
/ 04 ноября 2011

Возможно, вы захотите создать свой токенизатор или лексер.Такие инструменты, как Flex или ANTLR , должны помочь.И вы также можете сгенерировать свой анализатор с помощью ANTLR или Bison

Если вы настаиваете на ручном кодировании вашего лексера (и вашего анализатора), на практике крайне полезно иметь некоторый прогноз.Например, вы можете читать строку ввода построчно и разбивать токены внутри текущей строки (с возможностью проверки следующих нескольких символов).

...