Skip to content

label.stx

pdmosses/sdf/org.metaborg.meta.lang.template/trans/statix/label.stx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
module 

imports

  statix/name
  statix/util

signature

  sorts  constructors
    Quoted   : string -> Label
    Unquoted : string -> Label

rules

  : scope * Label
  labelOK(s, Quoted(name))   :- declareLabel(s, name).
  labelOK(s, Unquoted(name)) :- declareLabel(s, name).

rules // Label reusable predicates

   : scope * string
  declareLabel(, ) :-
    s -> Label{name},
    Label{name} in s |-> [(_, (_))] | error $[Duplicate definition of label [name]]@name.

  resolveLabel : scope * string
  resolveLabel(s, )  :- {}
    Label{name} in s |-> paths,
    resolveLabels(name, paths, NON_EMPTY()).

   : string * list((path * occurrence)) * EMPTINESS
  resolveLabels(, [(_, (Label{name'}))|labels], _) :-
    @name.ref += name',
    resolveLabels(name, labels, MAYBE_EMPTY()).
  resolveLabels(, [], NON_EMPTY()) :- false | error $[Label [name] is not defined]@name.
  resolveLabels(name, [], MAYBE_EMPTY()).