0

我一直在试图找到一个能够在 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 }

任何帮助将不胜感激。

4

1 回答 1

1

我假设您在谈论 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)在带引号的字符串中进行词法分析。这通常比尝试为所有令牌编写单个扫描程序更干净——一些令牌非常复杂。类似的技术通常用于扫描评论。

于 2021-02-22T02:40:08.673 回答