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
use crate::{
ast::*,
parser::{combinator::*, token::*},
};
use nom::{branch::alt, combinator::value, Parser};
pub fn list(input: &str) -> ParseResult<Parameter> {
tuple_((char_('('), comma_separated(parameter), char_(')')))
.map(|(_open, params, _close)| Parameter::List(params))
.parse(input)
}
pub fn parameter(input: &str) -> ParseResult<Parameter> {
alt((typed_parameter, untyped_parameter, omitted_parameter)).parse(input)
}
pub fn typed_parameter(input: &str) -> ParseResult<Parameter> {
tuple_((keyword, char_('('), parameter, char_(')')))
.map(|(name, _open, ty, _close)| Parameter::Typed {
keyword: name,
parameter: Box::new(ty),
})
.parse(input)
}
pub fn untyped_parameter(input: &str) -> ParseResult<Parameter> {
alt((
char_('$').map(|_| Parameter::NotProvided),
real.map(Parameter::Real),
integer.map(Parameter::Integer),
string.map(Parameter::String),
rhs_occurrence_name.map(Parameter::Ref),
enumeration.map(Parameter::Enumeration),
list,
))
.parse(input)
}
pub fn omitted_parameter(input: &str) -> ParseResult<Parameter> {
value(Parameter::Omitted, char_('*')).parse(input)
}
pub fn parameter_list(input: &str) -> ParseResult<Vec<Parameter>> {
comma_separated(parameter).parse(input)
}
#[cfg(test)]
mod tests {
use crate::ast::Parameter;
use nom::Finish;
#[test]
fn untyped_parameter() {
let (res, record) = super::untyped_parameter("2").finish().unwrap();
assert_eq!(res, "");
assert_eq!(record, Parameter::integer(2));
let (res, record) = super::untyped_parameter("2.0").finish().unwrap();
assert_eq!(res, "");
assert_eq!(record, Parameter::real(2.0));
}
}