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
если он не содержит один.