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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use crate::{
ast::{algorithm::*, expression::*},
derive_ast_component,
parser::*,
};
#[derive(Debug, Clone, PartialEq)]
pub struct TypeDecl {
pub type_id: String,
pub underlying_type: Type,
pub where_clause: Option<WhereClause>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Type {
Simple(SimpleType),
Named(String),
Set {
base: Box<Type>,
bound: Option<Bound>,
},
Bag {
base: Box<Type>,
bound: Option<Bound>,
},
List {
base: Box<Type>,
bound: Option<Bound>,
unique: bool,
},
Array {
base: Box<Type>,
bound: Option<Bound>,
unique: bool,
optional: bool,
},
Enumeration {
extensibility: Extensibility,
items: Vec<String>,
},
Select {
extensibility: Extensibility,
types: Vec<String>,
},
Aggregate {
base: Box<Type>,
label: Option<String>,
},
GenericEntity(Option<String>),
Generic(Option<String>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SimpleType {
Number,
Real,
Integer,
Logical,
Boolen,
String_ { width_spec: Option<WidthSpec> },
Binary { width_spec: Option<WidthSpec> },
}
derive_ast_component!(SimpleType, simple_types);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WidthSpec {
pub width: usize,
pub fixed: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Bound {
pub lower: Expression,
pub upper: Expression,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Extensibility {
None,
Extensible,
GenericEntity,
}