如何处理parser.mly中的变量声明?

时间:2011-06-27 16:38:37

标签: compiler-construction ocaml parser-generator

我正在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_bindingsbindingseparated_nonempty_list等结尾处优化menhir的部分,但我不知道如何...

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

1 个答案:

答案 0 :(得分: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