目前,我正试图用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 }
但问题仍未解决..。
发布于 2014-03-19 16:00:20
您的regexp中有许多不被识别的部分:
\\:把它放在单引号之间以匹配"\“字符;\.:只要把点放在单引号之间来匹配一个点,\w:ocamllex似乎不知道这个转义序列,您需要定义您的$:定义您的行尾。首先,把这个放在列明规则之前:
let w = ['a'-'z' 'A'-'Z' '0'-'9' '_']
let eol = '\n' | "\r\n"然后,把你的规则改为
[^'\\' '\n']*'.'w+eol匹配表达式(lxm)将包含行结束序列('\n‘或"\r\n"),因此需要删除它。
当您尝试匹配一个字符串到行的末尾时,要小心,因为默认行为是匹配最长的字符串,因此如果regexp接受行尾,则每次可以匹配多行。所以我才禁止“\n”。
https://stackoverflow.com/questions/22174326
复制相似问题