Как определить eof в ml-lex

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


sml
person noddy    schedule 31.01.2011    source источник


Ответы (1)


Руководство пользователя по ML-Lex и ML-Yacc от Роджера Прайса отлично подходит для изучения ml-lex. и мл-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.

Надеюсь, это поможет, иначе взгляните на парсер MLB или анализатор SML, написанный на языках ml-lex и ml-yacc. Синтаксический анализатор MLB является самым простым и, следовательно, его легче понять.

person Jesper.Reenberg    schedule 01.02.2011