Skip to content

type.stx

pdmosses/sdf/org.metaborg.meta.lang.template/trans/statix/type.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 

signature

  sorts  constructors
    SORT     : occurrence        -> TYPE
    SEQ      : TYPE * list(TYPE) -> TYPE
    OPT      : TYPE              -> TYPE
         : TYPE              -> TYPE
    ALT      : TYPE * TYPE       -> TYPE
     :                      TYPE
         : list(TYPE) * TYPE -> TYPE
          : list(TYPE) * TYPE -> TYPE
          : scope             -> TYPE

  relations
     : occurrence -> TYPE

rules

   : TYPE * list((path * (occurrence * TYPE)))
  onlyOneOf(ty, [(_, (_, ty ))|ps]) :- noneOf(ty, ps).
  onlyOneOf(ty, [(_, (_, ty'))|ps]) :- onlyOneOf(ty, ps).
  onlyOneOf(ty, [])                 :- false.

   : TYPE * list((path * (occurrence * TYPE)))
  noneOf(ty, [(_, (_, ty ))|ps]) :- false.
  noneOf(ty, [(_, (_, ty'))|ps]) :- noneOf(ty, ps).
  noneOf(ty, [])                 :- true.

   : list(TYPE) * list(TYPE) -> list(TYPE)
  appendTypes([t|ts], types) = [t|appendTypes(ts, types)].
  appendTypes([    ], types) = types.

   : list(list(TYPE)) -> list(TYPE)
  flattenTypes([ts|tts]) = appendTypes(ts, flattenTypes(tts)).
  flattenTypes([      ]) = [].