在没有解析器模块的情况下使用 ocamllex 构建词法分析器
Construction of a lexer with ocamllex without a parser module
我想在用 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 构建的简单词法分析器。
每个动作都是一个 OCaml 表达式,所以当你说它们没有映射到任何东西时,你真正说的是你使用的是未定义的符号。
正如@glennsl 指出的那样,您可以通过定义符号来完成这项工作。在规则之前的 .mll 文件顶部,花括号中有一个部分包含任何所需的 OCaml 代码。您可以在其中定义一个类型,如下所示:
{ type token = COMMA | ...
}
rule tokens = parse
| ',' { COMMA }
但是,令牌类型需要在词法分析器和解析器之间共享。因此,令牌通常在解析器文件中定义,解析器生成器(在您的情况下为 menhir)生成一个定义令牌类型的文件。因此,当您进入项目的下一步时,您可能希望从词法分析器文件中删除 token
类型的定义。
我想在用 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 构建的简单词法分析器。
每个动作都是一个 OCaml 表达式,所以当你说它们没有映射到任何东西时,你真正说的是你使用的是未定义的符号。
正如@glennsl 指出的那样,您可以通过定义符号来完成这项工作。在规则之前的 .mll 文件顶部,花括号中有一个部分包含任何所需的 OCaml 代码。您可以在其中定义一个类型,如下所示:
{ type token = COMMA | ...
}
rule tokens = parse
| ',' { COMMA }
但是,令牌类型需要在词法分析器和解析器之间共享。因此,令牌通常在解析器文件中定义,解析器生成器(在您的情况下为 menhir)生成一个定义令牌类型的文件。因此,当您进入项目的下一步时,您可能希望从词法分析器文件中删除 token
类型的定义。