Skip to content

symbol.stx

pdmosses/sdf/org.metaborg.meta.lang.template/trans/statix/symbol.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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
module 

imports

  statix/type
  statix/sort
  statix/label

signature

  sorts  constructors
    Sort              : string                -> Symbol
    ParameterizedSort : string * list(Symbol) -> Symbol

    Cf          : Symbol                -> Symbol
    Lex         : Symbol                -> Symbol
    Varsym      : Symbol                -> Symbol
    Label       : Label  * Symbol       -> Symbol
    Sequence    : Symbol * list(Symbol) -> Symbol
    Opt         : Symbol                -> Symbol
    Iter        : Symbol                -> Symbol
    IterStar    : Symbol                -> Symbol
    IterSep     : Symbol * Separator    -> Symbol
    IterStarSep : Symbol * Separator    -> Symbol
    Alt         : Symbol * Symbol       -> Symbol

    Layout    :              Symbol
    CharClass : CharClass -> Symbol
    Lit       : string    -> Symbol
    CiLit     : string    -> Symbol

  sorts  CharClass

rules

  : scope * Symbol -> TYPE

  typeOfSymbol(s, sy@Sort(name)) =  :-
    typeOfSort(s, name) == T,
    @sy.type := T.
  typeOfSymbol(, sy@ParameterizedSort(name, symbols)) =  :-
    typeOfSort(s, name) == T,
    typesOfSymbols(s, symbols) == _,
    @sy.type := T.

  typeOfSymbol(s, Cf(symbol)) = T :-
    typeOfSymbol(s, symbol) == T.
  typeOfSymbol(s, Lex(symbol)) = T :-
    typeOfSymbol(s, symbol) == T.
  typeOfSymbol(s, Varsym(symbol)) = T :-
    typeOfSymbol(s, symbol) == T.
  typeOfSymbol(, Label(label, symbol)) = T :-
    labelOK(s, label),
    typeOfSymbol(s, symbol)  == T.
  typeOfSymbol(, Sequence(symbol, symbols)) = SEQ(T, TS) :-
    typeOfSymbol(s, symbol) == T,
    typesOfSymbols(s, symbols) == TS.
  typeOfSymbol(s, Opt(symbol)) = OPT(T) :-
    typeOfSymbol(s, symbol) == T.
  typeOfSymbol(s, Iter(symbol)) = ITER(T) :-
    typeOfSymbol(s, symbol) == T.
  typeOfSymbol(s, IterStar(symbol)) = ITER(T) :-
    typeOfSymbol(s, symbol) == T.
  typeOfSymbol(s, IterSep(symbol, _)) = ITER(T) :-
    typeOfSymbol(s, symbol) == T.
  typeOfSymbol(s, IterStarSep(symbol, _)) = ITER(T) :-
    typeOfSymbol(s, symbol) == T.
  typeOfSymbol(, Alt(symbol1, symbol2)) = ALT(T1, T2) :-
    typeOfSymbol(s, symbol1) == T1,
    typeOfSymbol(s, symbol2) == T2.

  typeOfSymbol(s, Layout())     = TERMINAL().
  typeOfSymbol(s, CharClass(_)) = TERMINAL().
  typeOfSymbol(s, Lit(_))       = TERMINAL().
  typeOfSymbol(s, CiLit(_))     = TERMINAL().

   maps typeOfSymbol(*, list(*)) = list(*)