我正在用ocamllex编写一个玩具编程语言,并试图使该语言对缩进更改敏感,python风格,但我遇到了一个问题,与ocamllex的正则表达式规则的行首匹配。我习惯于使用^来匹配行首,但在OCaml中,这是字符串连接运算符。不幸的是,谷歌搜索对我来说并不多见:(有人知道这是如何工作的吗?
发布于 2011-03-16 01:00:41
我不确定是否有对零长度匹配符号的显式支持(就像Perl风格的正则表达式中的^,它匹配的是位置而不是子字符串)。但是,您应该能够让您的lexer将换行符转换为显式标记,如下所示:
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 }
(* ... *)这是未经测试的,但总体思路是:
注意:如果输入不包含\n,则需要对输入进行预处理,以便从单个one开始。
https://stackoverflow.com/questions/5314662
复制相似问题