nom_lua/
statement.rs

1// Copyright 2017 The nom-lua project developers
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9use ast::ASTNode;
10use name::{parse_label, parse_name};
11//use function::parse_local_function;
12use 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        //varlist=explist
22        //functioncall
23        parse_label |
24        parse_goto
25        //do end (deps block)
26        //while (deps exp, block)
27        //repeat until (deps exp, block)
28        //if (deps exp, block)
29        //for (deps exp, block)
30        //for in (deps exp, explist, block)
31        //function (deps funcname)
32        //parse_local_function
33        //local (deps namelist, explist)
34));
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}