Как обнаружить eof в мл-лекс - PullRequest
1 голос
/ 31 января 2011

При написании кода в ml-lex нам нужно написать, чтобы написать функцию eof val eof = fn () => EOF; это необходимая часть для записи, если я хочу, чтобы мой лексер остановился на обнаружении eof, то что я должен добавить кданная функция.Благодаря.

1 Ответ

2 голосов
/ 01 февраля 2011

Руководство пользователя для 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 является самым простым и, следовательно, может быть легче для понимания.

...