我正在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.mly
(terminated_bindings
,binding
,separated_nonempty_list
等结尾处优化menhir的部分,但我不知道如何...
有人可以帮忙吗?非常感谢你!
答案 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
。