首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCamllex:正则表达式

OCamllex:正则表达式
EN

Stack Overflow用户
提问于 2014-03-04 14:13:44
回答 1查看 2.1K关注 0票数 1

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

代码语言:javascript
复制
{

    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 }

但问题仍未解决..。

EN

回答 1

Stack Overflow用户

发布于 2014-03-19 16:00:20

您的regexp中有许多不被识别的部分:

  • \\:把它放在单引号之间以匹配"\“字符;
  • \.:只要把点放在单引号之间来匹配一个点,
  • \w:ocamllex似乎不知道这个转义序列,您需要定义您的
  • $:定义您的行尾。

首先,把这个放在列明规则之前:

代码语言:javascript
复制
let w = ['a'-'z' 'A'-'Z' '0'-'9' '_']
let eol = '\n' | "\r\n"

然后,把你的规则改为

代码语言:javascript
复制
[^'\\' '\n']*'.'w+eol

匹配表达式(lxm)将包含行结束序列('\n‘或"\r\n"),因此需要删除它。

当您尝试匹配一个字符串到行的末尾时,要小心,因为默认行为是匹配最长的字符串,因此如果regexp接受行尾,则每次可以匹配多行。所以我才禁止“\n”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22174326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档