OCamllex:正则表达式

时间:2014-03-04 14:13:44

标签: ocaml ocamlyacc ocamllex

目前我正在尝试在Ocaml中编写一个解释器,这是我的lexer.mll:

{

    open Parser
    exception Eof
}


rule main = parse
      [ ' ' '\t' ]  { main lexbuf } 
    | [ '\n' ]  { EOL } 
    | ['0'-'9']+ as lxm { LINE_NUMBER(int_of_string lxm) }
    | [^\\]*\.(\w+)$  as lxm { FILE_NAME lxm }
    | "get_line"    { GET_LINE }    
    (*| [ ^-?\b([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])\b ]     { RANGE }   (* -2055 < RANGE < 2055 *)*)
    | eof   { raise Eof }

我真的很困惑为什么ocamllex在{FILE_NAME lxm}行给我一个错误。如果我将#load "str.cma"放在词法分析器的开头,则会在该行上打印出错误语法错误。

为什么呢?我很困惑......

修改

应为[ [^\\]*\.(\w+)$ ] as lxm { FILE_NAME lxm }

但问题仍未解决......

1 个答案:

答案 0 :(得分:2)

您的正则表达式的许多部分无法识别:

  • \\:将它放在单引号之间以匹配&#34; \&#34;字符;
  • \.:只需在单引号之间加点以匹配点
  • \w:ocamllex似乎不知道这个转义序列,你需要定义你的序列,
  • $:定义您的行结尾。

首先,在lexing规则之前加上这个:

let w = ['a'-'z' 'A'-'Z' '0'-'9' '_']
let eol = '\n' | "\r\n"

然后,将您的规则更改为

[^'\\' '\n']*'.'w+eol

匹配的表达式(lxm)将包含行结束序列('\n&#39;或"\r\n"),因此您需要将其删除。

当您尝试将字符串匹配到行尾时要小心,因为默认行为是匹配最长的字符串,因此如果您的正则表达式接受行结尾,它可以一次匹配多行。这就是为什么我禁止&#39; \ n&#39;