Как бороться с объявлением переменных в parser.mly? - PullRequest
1 голос
/ 27 июня 2011

Я пишу компилятор мини-паскаля в Ocaml.Я хотел бы, чтобы мой компилятор принял следующий код, например:

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 и т. Д.), Но я не знаю, как ...

Можеткто-нибудь поможет?Большое спасибо!

1 Ответ

2 голосов
/ 28 июня 2011

Судя по всему, в ваших правилах привязки у вас есть доступ к 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.

...