OCamllex 匹配行首?

6 ocaml ocamllex

我正在用 ocamllex 在 OCaml 中编写一种玩具编程语言,并试图使该语言对缩进更改敏感,python 风格,但在将行开头与 ocamllex 的正则表达式规则匹配时遇到问题。我习惯使用^来匹配行的开头,但在 OCaml 中这是字符串连接运算符。不幸的是,谷歌搜索对我来说并没有出现太多:(有人知道这是如何工作的吗?

pho*_*oji 4

我不确定是否明确支持零长度匹配符号(例如^在 Perl 样式的正则表达式中,它匹配位置而不是子字符串)。但是,您应该能够让词法分析器将换行符转换为显式标记,如下所示:

解析器.mly

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

词法分析器

{
 open Parser
 exception Eof
}
rule token = parse
    [' ' '\t']           { token lexbuf }     (* skip other blanks *)
  | ['\n'][' ']+ as lxm  { EOLWS(String.length(lxm)) }
  | ['\n']               { EOL }
  (* ... *)
Run Code Online (Sandbox Code Playgroud)

这是未经测试的,但总体思路是:

  • 将换行符视为语句“起始符”
  • 测量紧随换行符之后的空白并将其长度作为int

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