2014-09-13 4 views
3

Согласно грамматике Паскаля, программа заканчивается точкой. И если после этого есть что-то, Free Pascal (FPC/Lazarus) опускает оставшихся персонажей.Опустить оставшийся вход в Happy (генератор парсера для Haskell)

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

По существу я хотел бы somithng так:

Program : Header Decls Body '.' SKIP_THE_REMAINING_INPUT { ... } 

Важно, что ни лексического анализа не должно происходить на всех после этого последней точки разбора, так как это может привести к ошибкам.

ответ

1

Так что я нашел решение.

Там есть функция под названием частичный синтаксический в Хэппи, описанный в documentation, хотя я обнаружил, что чтение git log из репозитория. Это позволяет парсеру отбрасывать оставшийся вход. Он объявляется с помощью директивы иначе, чем %name:

%name parser {- normal parser -} 
%partial parser {- partial parser -} 

Но, как она работает не подходит мое второе требование: оно не должно заставить ленивую Tokenizer потреблять вход дальше. Вместо этого ему нужен ровно еще один токен, чтобы проверить, что больше нечего разбирать.

Предположим, что ! не является допустимым символом и токенизатор не может потреблять его, и рассмотрим следующие входы:

  1. begin end. valid_token!!!
  2. begin end.!

Синтаксический (1) преуспевает, потому что Happy проверяет valid_token и останавливается там, но разбор (2) терпит неудачу, так как требуется еще один токен (и токензатор не может его дать).

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

 Смежные вопросы

  • Нет связанных вопросов^_^