OCamllex соответствует началу строки? - PullRequest
3 голосов
/ 15 марта 2011

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

1 Ответ

4 голосов
/ 15 марта 2011

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

parser.mly

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

лексер.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, если он не содержит такового.

...