1

我正在用 Ocaml 编写一个 mini-pascal 编译器。例如,我希望我的编译器接受以下代码:

program test;
var
   a,b : boolean;
   n : integer;
begin
   ...
end.

我在处理变量声明时遇到了困难(以下部分var)。目前,变量的类型在sib_syntax.ml中定义如下:

type s_var =
    { s_var_name: string;
      s_var_type: s_type; }

这是sib_parser.mly。我的问题是,我可以在哪里以及如何告诉编译器构建globals,变量的声明,它实际上是一个s_var. 我想我需要在sib_parser.mlyterminated_bindings, binding, separated_nonempty_list, 等)的末尾提炼menhir的部分,但我不知道如何......

有人可以帮忙吗?非常感谢你!

4

1 回答 1

2

从它的外观来看,在您的绑定规则中,您可以访问ids哪个是变量名称列表,因此您可以编写,例如:

binding:
  | ids = separated_nonempty_list(COMMA, IDENT) COLON INTEGER
      { List.map (fun id -> { s_var_name = id ; s_var_type = St_int}) ids }
  | ids = separated_nonempty_list(COMMA, IDENT) COLON BOOLEAN
      { List.map (fun id -> { s_var_name = id ; s_var_type = St_bool}) ids }

这将使binding规则返回一个s_var list.

于 2011-06-27T22:07:13.730 回答