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(*)
|