微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ocamllex 中的词法字符串

如何解决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 举报,一经查实,本站将立刻删除。