目前我正在尝试在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 }
但问题仍未解决......
答案 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;