vinci/parser/instruction/
while_loop.rs

1use crate::ast::instructions::while_loop::While;
2use crate::ast::instructions::Node;
3use crate::lexer::token::Token;
4use crate::parser::error::ParseError;
5use crate::parser::Parser;
6
7/// ```
8/// use vinci::ast::AST;
9/// use vinci::ast::instructions::conditional::Conditional;
10/// use vinci::ast::instructions::Node;
11/// use vinci::ast::instructions::while_loop::While;
12/// use vinci::parse;
13/// use vinci::types::ValueType;
14/// let mut input = ".WHILE CONDITION { .CONSTANT BOOL true; } THEN { .CONSTANT INT 10; };";
15/// let result = parse(input);
16///
17/// assert_eq!(result, AST {nodes: vec![
18///     Node::WHILE(
19///         Box::new(While {
20///             condition: Node::CONSTANT(ValueType::Boolean(true)),
21///             body: vec![Node::CONSTANT(ValueType::Integer(10))],
22///         })
23///     )]
24/// });
25/// ```
26pub fn parse_while_instruction(parser: &mut Parser) -> Result<Node, ParseError> {
27    let condition: Node;
28    let body: Vec<Node>;
29
30    parser.expected(Token::Condition)?;
31    parser.expected(Token::LeftCurly)?;
32
33    let current = parser.next_token();
34    condition = parser.parse_node(&current)?;
35
36    parser.expected(Token::RightCurly)?;
37    parser.expected(Token::Then)?;
38    parser.expected(Token::LeftCurly)?;
39
40    body = parser.parse_nodes()?;
41
42    parser.expected(Token::Semicolon)?;
43
44    Ok(Node::WHILE(Box::new(While { condition, body })))
45}