Когда использовать оператор «и» в Ocaml AST - PullRequest
0 голосов
/ 10 ноября 2018

Я перевожу правила моей грамматики в AST.

Необходимо ли использовать оператор "и" при определении нашего AST?

Например, я перевел мою грамматику до сих пор так:

type program =
   |  Decls of typ * identifier * decls_prime

type typ =
   | INT
   | BOOL
   | VOID

type identifier = string

(* decls_prime = vdecl decls | fdecl decls *)
type declsprime =
   | Vdecl of variabledeclaration * decls
   | Fdecl of functiondeclaration * decls

(*“lparen” formals_opt “rparen” “LBRACE” vdecl_list stmt_list “RBRACE”*)
type functiondeclaration =
    | Fdecl of variabledeclarationlist * stmtlist

(*formals_opt = formal_list | epsilon *)
type FormalsOpt =
   |FormalsOpt of formallist

(* typ “ID” formal_list_prime *)
type formalList =
    | FormalList of typ * identifier * formallistprime

type formallistprime =
    | FormalListPrime of formalList

type variabledeclarationlist =
    | VdeclList of variabledeclaration * variabledeclarationlist

(*stmt stmt_list | epsilon*)
type stmtlist =
    | StmtList of stmt * stmtlist
    | StmtlistNil 

(* stmt = “RETURN” stmt_prime| expr SEMI |“LBRACE” stmt_list RBRACE| IF LPAREN expr RPAREN stmt stmt_prime_prime| FOR LPAREN expr_opt SEMI expr SEMI expr_opt RPAREN stmt| WHILE LPAREN expr RPAREN stmt*)
type Stmt
| Return of stmtprime
| Expression of expr
| StmtList of stmtlist
| IF of expr * stmt * stmtprimeprime
| FOR of expropt * expr * expropt * stmt 
| WHILE of expr * stmt

(*stmt_prime = SEMI| expr SEMI*)
type stmtprime
| SEMI 
| Expression of expr 

(*NOELSE | ELSE stmt*)
type stmtprimeprime
| NOELSE 
| ELSE of stmt

(* Expr_opt = expr | epsilon *)
type expropt =
| Expression of expr 
| ExprNil 

type Expr

type ExprPrime

(* Actuals_opt  = actuals_list  | epsilon *)
type ActualsOpt= 
| ActualsList of actualslist 
| ActualsNil

type ActualsList = 
| ActualsList of expr * actualslistprime

(*actualslistprime = COMMA expr actuals_list_prime | epsilon*)
type actualslistprime = 
| ActualsListPrime of expr * actualslistprime
| ALPNil

Но похоже, что этот пример из Иллинойса использует немного другую структуру:

type program = Program of (class_decl list)
and class_decl = Class of id * id * (var_decl list) * (method_decl list)
and method_decl = Method....

Нужно ли использовать "и" при определении моего AST? И более того, не правильно ли мне использовать тип StmtList вместо (список stmt), даже если я правильно вызываю метод AST StmtList в моем анализаторе?

1 Ответ

0 голосов
/ 10 ноября 2018

Вам нужно только and, когда ваши определения взаимно рекурсивны. То есть, если оператор может содержать выражение, а выражение может, в свою очередь, содержать оператор, тогда Expr и Stmt должны быть связаны с and. Если ваш код компилируется без and, вам не нужно and.

PS: Это не связано с вашим вопросом, но я думаю, что было бы гораздо разумнее использовать типы list и option, чем определять собственные версии для определенных типов (таких как stmntlist, expropt и т. Д.). stmtprime является еще одним таким случаем: вы можете просто определить Return как Return of expr option и избавиться от типа stmtprime. То же самое с stmtprimeprime.

...