Module Analyzer

Semantic analyzer

include Analyzer__.Breakdown
type b_arg =

リンク:アトムの引数部分に埋め込まれたアトムは全て分解され,アトムの引数はリンクのみとなる

type b_atom = string * b_arg list

アトムはアトム名とリンクのリスト

type b_ind =
| BLocalInd of int * b_atom

局所リンクによって指されるアトム

| BFreeInd of string * b_atom

自由リンクによって指されるアトム

| BRedir of string * string

自由リンクのリダイレクト

type lhs = (int * int) list * b_ind list

(local_indegs, b_ind list)

type free_indeg_diffs = (string * int) list

ルール左辺・右辺における自由リンクの入次数の差分

  • ただし,indirection アトムからの参照数は数えないものとする
type rhs_graph = (int * b_atom) list * (string * b_atom) list * (string * string) list

(local_inds, free_inds, redirs)

type rhs = (int * int) list * rhs_graph

(local_indegs, rhs_graph)

type b_rule =
| BRule of lhs * free_indeg_diffs * rhs
val breakdown_arg : (int * (int * int) list) -> Analyzer__.Alpha.a_arg -> (int * (int * int) list) * (b_arg * b_ind list)

Breakdown argument atoms

val breakdown_args : (int * (int * int) list) -> Analyzer__.Alpha.a_arg list -> (int * (int * int) list) * (b_arg list * b_ind list)
val breakdown_ind : (int * (int * int) list) -> Analyzer__.Alpha.a_atom -> (int * (int * int) list) * b_ind list

Breakdown argument atoms on right hand side of indirection. Indirection from/to local link is not allowed (should be resolved in the former phase, which is not implemented) and raise an error Redundant indirection.

val breakdown_inds : (int * (int * int) list) -> Analyzer__.Alpha.a_atom list -> (int * int) list * b_ind list

Breakdown argument atoms on right hand side of indirections. Returns (local_indegs, b_ind list). Takes link_id which has returned from the Alpha.prep.

val check_rule : ((((('a * (string * 'b) list) * string list) * 'c) * 'd list) * (((('a * (string * 'b) list) * string list) * 'e) * 'f list)) -> unit

Bheck a rule whether meets the conditions

val classify_ind : b_ind -> (int * b_atom, string * b_atom, string * string) Util.either3

インダイレクションを分類する

val partition_inds : b_ind list -> (int * b_atom) list * (string * b_atom) list * (string * string) list

インダイレクションを分類に基づいて分割する

val free_indeg_diff_of : ('a * int) list -> ('a * int) -> 'a * int
val free_indeg_diffs_of : ('a * int) list -> ('a * int) list -> ('a * int) list

ルール左辺・右辺における自由リンクの入次数の差分を求める

val breakdown : Parse.proc -> ((((int * int) list * (string * int) list) * string list) * b_ind list) * b_rule list

AST を一本のリストにする

  • リンク条件のチェックも行う
val breakdown_rule : (Parse.proc * Parse.proc) -> b_rule
val sem_graph_of : Parse.proc -> ((int * int) list * ((int * b_atom) list * (string * b_atom) list * (string * string) list)) * b_rule list

semantic analyzer

returns

semantic graph obtained from the given AST