Я пишу компилятор мини-паскаля на 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;
s_var_uniqueId: s_uniqueId (* key *) }
Где s_var_uniqueId
(вместо s_var_name
) - уникальный ключ переменные. Мой первый вопрос: где и как я мог бы реализовать механизм генерации нового идентификатора (фактически, увеличивая самый большой идентификатор на 1) каждый раз, когда у меня появляется новая переменная. Мне интересно, следует ли мне реализовать его в sib_parser.mly , который, вероятно, включает статическую переменную cur_id
и модификацию части привязки
, опять же, не надо » Я не знаю, как их реализовать в .mly
.Или реализовать механизм на следующем этапе - интерпретатор.ml
? но в этом случае вопрос в том, как сделать .mly
совместимым с типом s_var
, что s_var_uniqueId
я должен предоставить в части привязка
?
Другой вопрос касается этой части утверждения
в .mly
:
id = IDENT COLONEQ e = expression
{ Sc_assign (Sle_var {s_var_name = id; s_var_type = St_void}, e) }
Здесь мне также нужно предоставить следующий уровень ( Interpreter.ml
) переменная, из которой мне известно только s_var_name
, так что я могу сделать с ее s_var_type
и s_var_uniqueId
здесь? Может ли кто-нибудь помочь? Большое спасибо!