1use ast::ASTNode;
10use name::{parse_label, parse_name};
11use exp::parse_explist;
13
14named!(parse_goto<ASTNode>, map!(map!(preceded!(tag!("goto"), ws!(parse_name)), Box::new), ASTNode::Goto));
15
16named!(parse_semicolon, ws!(tag!(";")));
17named!(parse_semicolon_statement<ASTNode>, map!(parse_semicolon, |_| ASTNode::EmptyStatement));
18
19named!(pub parse_statement<ASTNode>, alt!(
20 parse_semicolon_statement |
21 parse_label |
24 parse_goto
25 ));
35
36named!(pub parse_retstat<ASTNode>, map!(map!(
37 delimited!(
38 tag!("return"),
39 ws!(opt!(complete!(parse_explist))),
40 opt!(complete!(tag!(";")))
41 ),
42 Box::new), ASTNode::RetStat));
43
44#[cfg(test)]
45mod tests {
46 use ast::ASTNode::*;
47
48 ast_valid!(parse_semicolon, parse_semicolon, ";");
49
50 ast_test!(parse_goto_1, parse_goto, "goto valid",
51 astb!(Goto, ast!(Name, "valid".into())));
52 ast_panic_test!(parse_goto_2, parse_goto, "goto 17");
53 ast_panic_test!(parse_goto_3, parse_goto, "got 17");
54
55 ast_test!(parse_retstat_1, parse_retstat, "return false,true ;",
56 astb!(RetStat, Some(ast!(ExpList, vec![
57 ast!(Bool, false),
58 ast!(Bool, true)
59 ]))));
60
61 ast_test!(parse_retstat_2, parse_retstat, "return 1.0",
62 astb!(RetStat, Some(ast!(ExpList, vec![
63 ast!(Float, 1.0),
64 ]))));
65
66 ast_test!(parse_retstat_3, parse_retstat, "return",
67 astb!(RetStat, None));
68}