/
DataDcl.sv
79 lines (68 loc) · 2.4 KB
/
DataDcl.sv
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
78
79
grammar silver:compiler:extension:data;
concrete production dataDcl
top::AGDcl ::= 'data' id::Name tl::BracketedOptTypeExprs '=' ctors::DataConstructors ';'
{
top.unparse = s"data ${id.unparse}${tl.unparse} = ${ctors.unparse};";
ctors.ntName = id.name;
ctors.ntTypeArgs = tl;
forwards to appendAGDcl(
nonterminalDcl(
dataNTQualifier($1, nilNTQualifier()),
'nonterminal', id, tl, nonterminalModifiersNone(), ';'),
ctors.ctorDcls);
}
concrete production dataDclWith
top::AGDcl ::= 'data' id::Name tl::BracketedOptTypeExprs '=' ctors::DataConstructors 'with' attrs::QNames ';'
{
top.unparse = s"data ${id.unparse}${tl.unparse} = ${ctors.unparse};";
ctors.ntName = id.name;
ctors.ntTypeArgs = tl;
forwards to appendAGDcl(
nonterminalWithDcl(
dataNTQualifier($1, nilNTQualifier()),
'nonterminal', id, tl, nonterminalModifiersNone(), 'with', attrs, ';'),
ctors.ctorDcls);
}
synthesized attribute ctorDcls::AGDcl;
inherited attribute ntName::String;
inherited attribute ntTypeArgs::BracketedOptTypeExprs;
terminal DataConstructorOr_t '|' lexer classes {SPECOP};
tracked nonterminal DataConstructors with unparse, grammarName, config, ctorDcls, ntName, ntTypeArgs;
propagate grammarName, config, ntName, ntTypeArgs on DataConstructors;
concrete production consDataConstructor
top::DataConstructors ::= h::DataConstructor '|' t::DataConstructors
{
top.unparse = s"${h.unparse} | ${t.unparse}";
top.ctorDcls = appendAGDcl(h.ctorDcls, t.ctorDcls);
}
concrete production oneDataConstructor
top::DataConstructors ::= h::DataConstructor
{
top.unparse = s"${h.unparse}";
top.ctorDcls = h.ctorDcls;
}
concrete production nilDataConstructor
top::DataConstructors ::=
{
top.unparse = "";
top.ctorDcls = emptyAGDcl();
}
tracked nonterminal DataConstructor with unparse, grammarName, config, ctorDcls, ntName, ntTypeArgs;
propagate grammarName, config on DataConstructor;
concrete production dataConstructor
top::DataConstructor ::= id::Name rhs::ProductionRHS
{
top.unparse = s"${id.unparse} ${rhs.unparse}";
local ntBaseType::TypeExpr = nominalTypeExpr(
qNameTypeId(terminal(IdUpper_t, top.ntName, id.nameLoc)));
local ntType::TypeExpr =
case top.ntTypeArgs of
| botlNone() -> ntBaseType
| botlSome(btl) -> appTypeExpr(ntBaseType, btl)
end;
top.ctorDcls = Silver_AGDcl {
abstract production $Name{id}
top::$TypeExpr{ntType} ::= $ProductionRHS{rhs}
{}
};
}