Skip to content

priority.stx

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

imports

  statix/section/grammar
  statix/section/syntax
  statix/sort_cons

signature

  constructors
    Priorities             : list(Priority) -> Grammar
    LexicalPriorities      : list(Priority) -> Grammar
    ContextFreePriorities  : list(Priority) -> Grammar

  sorts  constructors
    Chain : list(Group)                   -> Priority
    Assoc : Group * Associativity * Group -> Priority

  sorts  constructors
    WithArguments  : Group * ArgumentIndicator                -> Group
    NonTransitive  : Group                                    -> Group
    SimpleGroup    : PriorityProduction                       -> Group
    ProdsGroup     : list(PriorityProduction)                 -> Group
    AssocGroup     : Associativity * list(PriorityProduction) -> Group
    SimpleRefGroup : SortConsRef                              -> Group
    ProdsRefGroup  : list(SortConsRef)                        -> Group
    AssocRefGroup  : Associativity * list(SortConsRef)        -> Group

  sorts  constructors
    PriorityProduction_SdfProduction : SdfProduction -> PriorityProduction
    PriorityProduction_Production    : Production    -> PriorityProduction

  sorts ArgumentIndicator 

rules

  grammarOK(s, Priorities(priorities))            :- prioritiesOK(s, priorities).
  grammarOK(s, LexicalPriorities(priorities))     :- prioritiesOK(s, priorities).
  grammarOK(s, ContextFreePriorities(priorities)) :- prioritiesOK(s, priorities).

  : scope * Priority
  priorityOK(s, Chain(groups)) :-
    groupsOK(s, groups).
  priorityOK(, Assoc(group1, _, group2)) :-
    groupOK(s, group1),
    groupOK(s, group2).
   maps priorityOK(*, list(*))

  : scope * Group
  groupOK(s, WithArguments(group, _))            :- groupOK(s, group).
  groupOK(s, NonTransitive(group))               :- groupOK(s, group).
  groupOK(s, SimpleGroup(priorityProduction))    :- priorityProductionOK(s, priorityProduction).
  groupOK(s, ProdsGroup(priorityProductions))    :- priorityProductionsOK(s, priorityProductions).
  groupOK(s, AssocGroup(_, priorityProductions)) :- priorityProductionsOK(s, priorityProductions).
  groupOK(s, SimpleRefGroup(sortConsRef))        :- typeOfSortConsRef(s, sortConsRef) == _.
  groupOK(s, ProdsRefGroup(sortConsRefs))        :- typeOfSortConsRefs(s, sortConsRefs) == _.
  groupOK(s, AssocRefGroup(_, sortConsRefs))     :- typeOfSortConsRefs(s, sortConsRefs) == _.
  groupsOK maps groupOK(*, list(*))

  : scope * PriorityProduction
  // TODO: these should not declare new productions, but instead should be checked against existing ones?
  priorityProductionOK(s, PriorityProduction_SdfProduction(sdfProduction)) :- typeOfSdfProduction(s, sdfProduction) == _.
  priorityProductionOK(s, PriorityProduction_Production(production))       :- productionOK(s, production).
   maps priorityProductionOK(*, list(*))