ocamlex匹配行的开头?

ocamlex匹配行的开头?,ocaml,ocamllex,Ocaml,Ocamllex,我正在用OCaml和OCAMLEX编写一个玩具编程语言,并试图使该语言对缩进变化、python风格敏感,但在匹配行的开头和OCAMLEX的正则表达式规则时遇到了问题。我习惯于使用^匹配行首,但在OCaml中,这是字符串concat运算符。不幸的是,谷歌搜索并没有给我带来太多的帮助:(有人知道这是怎么回事吗?我不确定是否有对零长度匹配符号的明确支持(比如Perl风格的正则表达式中的^,它匹配一个位置而不是一个子字符串).但是,您应该能够让您的lexer将换行符转换为显式标记,如下所示: parse

我正在用OCaml和OCAMLEX编写一个玩具编程语言,并试图使该语言对缩进变化、python风格敏感,但在匹配行的开头和OCAMLEX的正则表达式规则时遇到了问题。我习惯于使用
^
匹配行首,但在OCaml中,这是字符串concat运算符。不幸的是,谷歌搜索并没有给我带来太多的帮助:(有人知道这是怎么回事吗?

我不确定是否有对零长度匹配符号的明确支持(比如Perl风格的正则表达式中的
^
,它匹配一个位置而不是一个子字符串).但是,您应该能够让您的lexer将换行符转换为显式标记,如下所示:

parser.mly

%token EOL
%token <int> EOLWS
% other stuff here
%%
main:
    EOL stmt                { MyStmtDataType(0, $2) }
  | EOLWS stmt              { MyStmtDataType($1 - 1, $2) }
 ;
这是未经测试的,但总体思路是:

  • 将换行代码视为“起点”
  • 测量紧跟在换行符后面的空格,并将其长度作为
    int

警告:如果不包含一个,您需要预处理您的输入,以从单个
\n
开始。

正则表达式的语法可以在这里找到;是的,我看到了,我希望我只是缺少了一些东西,而且还有更多。谢谢!没问题。基于他们的说法,这肯定是一个自然的假设类似于Lex和通用正则表达式语言的知识。我不确定他们为什么不包括它;这可能是问fa.caml谷歌小组的问题。
{
 open Parser
 exception Eof
}
rule token = parse
    [' ' '\t']           { token lexbuf }     (* skip other blanks *)
  | ['\n'][' ']+ as lxm  { EOLWS(String.length(lxm)) }
  | ['\n']               { EOL }
  (* ... *)