Использование Ocamllex для лексических строк (The Tiger Compiler) - PullRequest
7 голосов
/ 26 апреля 2011

Я пытаюсь следовать «Реализации современного компилятора в Аппл» и пишу лексер с помощью Ocamllex.

Спецификация требует, чтобы лексер возвратил строки после перевода escape-последовательностей. Следующий код является выдержкой из входного файла ocamllex:

 rule tiger = parse
 ...
 | '"'
     { let buffer = Buffer.create 1 in
       STRING (stringl buffer lexbuf)
     }
 and  stringl buffer = parse
 | '"' { Buffer.contents buffer }
 | "\\t" { Buffer.add_char buffer '\t'; stringl buffer lexbuf }
 | "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
 | "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
 | '\\' '"' { Buffer.add_char buffer '"'; stringl buffer lexbuf }
 | '\\' '\\' { Buffer.add_char buffer '\\'; stringl buffer lexbuf }
 | eof { raise End_of_file }
 | _ as char { Buffer.add_char buffer char; stringl buffer lexbuf }

Есть ли лучший способ?

1 Ответ

5 голосов
/ 26 апреля 2011

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

Кроме того, у вас есть правило "\\n", повторенное дважды, и я думаю, 1 - очень пессимистическая оценка вашей длины строки, я бы предпочел использовать 20 здесь (чтобы избежать ненужного изменения размера).

...