Руководство пользователя для ML-Lex и ML-Yacc от Roger Price отлично подходит для изучения ml-lex и ml-yacc.
Функция eof обязательна в части объявлений пользователя вашего определения lex вместе с типом lexresult как:
Функция eof вызывается лексером, когда конец ввода
поток достигнут.
Где ваша функция eof может выдать исключение, если это подходит для вашего приложения или токена EOF. В любом случае он должен возвращать что-то типа lexresult. В главе 7.1.2 руководства пользователя приведен пример, который печатает строку, если EOF был в середине комментария блока.
Я использую несколько "более простую" функцию eof
structure T = Tokens
structure C = SourceData.Comments
fun eof data =
if C.depth data = 0 then
T.EOF (~1, ~1)
else
fail (C.start data) "Unclosed comment"
где структура C - это «специальная» структура обработки комментариев, которая подсчитывает количество открывающих и закрывающих комментариев. Если текущая глубина равна 0, то он возвращает токен EOF, где (~ 1, ~ 1) используются для обозначения левой и правой позиции. Поскольку я не использую эту информацию о положении для EOF, я просто установил ее на (~ 1, ~ 1).
Обычно тогда вы устанавливаете% eop (конец синтаксического анализа) для использования токена EOF в файле yacc, чтобы указать, что после любого начального символа, который используется, за ним может следовать токен EOF. Также не забудьте добавить EOF в% noshift. Раздел 9.4.5 для% eop и% noshift.
Очевидно, что вы должны определить EOF в% term декларации вашего файла yacc aswel.
Надеюсь, это поможет, иначе взгляните на парсер MLB или парсер SML , написанный на ml-lex и ml-yacc. Анализатор MLB является самым простым и, следовательно, может быть легче для понимания.