【问题标题】:Construction of a lexer with ocamllex without a parser module使用没有解析器模块的 ocamllex 构建词法分析器
【发布时间】:2021-11-23 20:56:47
【问题描述】:

我想在使用 menhir 构建解析器之前使用 ocamllex 构建词法分析器。

我已经编写了 .mll 文件。以下命令给了我这个消息:

> ocamllex lexer.mll
71 states, 2138 transitions, table size 8978 bytes

然后我输入了以下内容:

> ocamlc -c lexer.ml
File "lexer.mll", line 48, characters 12-17:
Error: Unbound constructor COMMA

.ml 文件的摘录:

       ...
(* Lexing Rules *)
rule tokens = parse
  | ',' { COMMA }
  | ';' { SEMICOLON }
  | '(' { LPAREN }
  | ')' { RPAREN }
  | '[' { LBRACKETS }
  | ']' { RBRACKETS }
  | '{' { LBRACE }
  | '}' { RBRACE }
       ...

我的理解是这些操作没有映射到任何东西,因此出现未绑定错误。
最后,我想知道的是如何在不编写解析器或 .mly 文件的情况下进行这些映射?我对这门语言很陌生,我想要实现的是一个使用 ocamllex 构建的简单词法分析器。

【问题讨论】:

  • 您需要一个描述所有标记的类型。显然你没有。

标签: compiler-construction ocaml lexer ocamllex


【解决方案1】:

每个动作都是一个 OCaml 表达式,所以当你说它们没有映射到任何东西时,你实际上是在说你正在使用未定义的符号。

正如@glennsl 指出的那样,您可以通过定义符号来完成这项工作。在规则之前的 .mll 文件的顶部,花括号中有一个部分,其中包含任何所需的 OCaml 代码。您可以在其中定义一个类型,如下所示:

{ type token = COMMA | ...
}
rule tokens = parse
| ',' { COMMA }

但是,词法分析器和解析器之间需要共享标记类型。因此,令牌通常在解析器文件中定义,解析器生成器(在您的情况下为 menhir)生成一个定义令牌类型的文件。因此,当您进入项目的下一步时,您可能希望从词法分析器文件中删除 token 类型的定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多