OCamllex соответствует началу строки?

Я возился с написанием игрушечного языка программирования на OCaml с помощью ocamllex, и пытался сделать язык чувствительным к изменениям отступов в стиле python, но у меня возникла проблема с соответствием начала строки правилам регулярного выражения ocamllex. Я привык к использованию ^ соответствовать началу строки, но в OCaml это оператор строки concat. Поиски в Google, к сожалению, меня мало интересуют:(Кто-нибудь знает, как это будет работать?

1 ответ

Решение

Я не уверен, есть ли явная поддержка символов совпадения нулевой длины (например, ^ в регулярных выражениях в стиле Perl, которые соответствуют позиции, а не подстроке). Однако вы должны иметь возможность позволить вашему лексеру превращать переводы строк в явный токен, что-то вроде этого:

parser.mly

%token EOL
%token <int> EOLWS
% other stuff here
%%
main:
    EOL stmt                { MyStmtDataType(0, $2) }
  | EOLWS stmt              { MyStmtDataType($1 - 1, $2) }
 ;

lexer.mll

{
 open Parser
 exception Eof
}
rule token = parse
    [' ' '\t']           { token lexbuf }     (* skip other blanks *)
  | ['\n'][' ']+ as lxm  { EOLWS(String.length(lxm)) }
  | ['\n']               { EOL }
  (* ... *)

Это не проверено, но общая идея такова:

  • Относитесь к переводу строк как к "стартерам"
  • Измерьте пробел, который следует сразу за символом новой строки, и передайте его длину как int

Предостережение: вам нужно предварительно обработать ввод, чтобы начать с одного \n если он не содержит один.

Другие вопросы по тегам