Skip to main content

litex/parse/by_stmt/
closed_range_by_stmt.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn parse_by_closed_range_as_cases_stmt(
5        &mut self,
6        tb: &mut TokenBlock,
7    ) -> Result<Stmt, RuntimeError> {
8        tb.skip_token(CLOSED_RANGE)?;
9        tb.skip_token(AS)?;
10        tb.skip_token(CASES)?;
11        tb.skip_token(COLON)?;
12
13        let element = self.parse_obj(tb)?;
14        tb.skip_token(FACT_PREFIX)?;
15        tb.skip_token(IN)?;
16        let range_obj = self.parse_obj(tb)?;
17        let closed_range = match range_obj {
18            Obj::ClosedRange(cr) => cr,
19            _ => {
20                return Err(RuntimeError::from(ParseRuntimeError(RuntimeErrorStruct::new_with_msg_and_line_file("by closed_range as cases: expected closed_range(lo, hi) or lo ... hi after `$in`"
21                        .to_string(), tb.line_file.clone()))));
22            }
23        };
24
25        if !tb.exceed_end_of_head() {
26            return Err(RuntimeError::from(ParseRuntimeError(
27                RuntimeErrorStruct::new_with_msg_and_line_file(
28                    "by closed_range as cases: expected end of line after membership fact"
29                        .to_string(),
30                    tb.line_file.clone(),
31                ),
32            )));
33        }
34        Ok(ByClosedRangeAsCasesStmt::new(element, closed_range, tb.line_file.clone()).into())
35    }
36}