如何解决ocamllex 中的词法字符串
我一直在尝试找到一个很好的例子来处理 ocamllex 中的字符串时遇到了一些麻烦。我发现桌面计算器示例有点有用,但还没有真正找到以类似方式实现它的方法,它也使用字符串,这是我引用的示例:
{
open Parser (* The type token is defined in parser.mli *)
exception Eof
}
rule token = parse
[' ' '\t'] { token lexbuf } (* skip blanks *)
| ['\n' ] { EOL }
| ['0'-'9']+ as lxm { INT(int_of_string lxm) }
| '+' { PLUS }
| '-' { MINUS }
| '*' { TIMES }
| '/' { DIV }
| '(' { LPAREN }
| ')' { RPAREN }
| eof { raise Eof }
任何帮助将不胜感激。
解决方法
我假设您正在谈论 OCaml 中的双引号字符串。词法字符串的难点在于它们需要某种转义机制来允许表示引号(通常还有转义机制本身)。
这里是 OCaml 词法分析器本身的字符串代码的简化版本:
let string_buff = Buffer.create 256
let char_for_backslash = function
| 'n' -> '\010'
| 'r' -> '\013'
| 'b' -> '\008'
| 't' -> '\009'
| c -> c
. . .
let backslash_escapes =
['\\' '\'' '"' 'n' 't' 'b' 'r' ' ']
. . .
rule main = parse
. . .
| '"'
{ Buffer.clear string_buff;
string lexbuf;
STRING (Buffer.contents string_buff) }
. . .
and string = parse
| '"'
{ () }
| '\\' (backslash_escapes as c)
{ Buffer.add_char string_buff (char_for_backslash c);
string lexbuf }
| _ as c
{ Buffer.add_char string_buff c;
string lexbuf }
编辑:此代码的主要特点是它使用第二个扫描器(名为 string
)在带引号的字符串中进行词法分析。这通常比尝试为所有令牌编写单个扫描器更简洁——有些令牌非常复杂。类似的技术常用于扫描评论。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。