Я не уверен, есть ли явная поддержка символов совпадения нулевой длины (например, ^
в регулярных выражениях в стиле 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
, если он не содержит такового.