OCamllex匹配行首?

时间:2011-03-15 16:17:54

标签: ocaml ocamllex

我正在使用ocamllex在OCaml中编写玩具编程语言,并试图使语言对缩进更改敏感,python风格,但是在使用ocamllex的正则表达式规则匹配行的开头时遇到问题。我习惯使用^来匹配行的开头,但是在OCaml中是字符串concat运算符。不幸的是,谷歌的搜索对我来说并没有太大的影响:(任何人都知道这会起作用吗?

1 个答案:

答案 0 :(得分:4)

我不确定是否明确支持零长度匹配符号(如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 }
  (* ... *)

这是未经测试的,但一般的想法是:

  • 将换行视为staetment'starters'
  • 测量紧跟换行符后面的空格,并将其长度作为int
  • 传递

警告:如果不包含单个\n,您需要预先处理输入。