Skip to main content

litex/parse/by_stmt/
fn_tuple_by_stmt.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn parse_by_fn_stmt(&mut self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
5        tb.skip_token(FN_LOWER_CASE)?;
6        if tb.current_token_is_equal_to(SET) {
7            tb.skip_token(SET)?;
8            tb.skip_token(COLON)?;
9            return self.parse_by_fn_set_stmt(tb);
10        }
11        tb.skip_token(COLON)?;
12        let function = self.parse_obj(tb)?;
13        Ok(ByFnStmt::new(function, tb.line_file.clone()).into())
14    }
15
16    pub fn parse_by_fn_set_stmt(&mut self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
17        let func = self.parse_obj(tb)?;
18        tb.skip_token(FACT_PREFIX)?;
19        tb.skip_token(IN)?;
20        tb.skip_token(FN_LOWER_CASE)?;
21        let fn_set = self.parse_fn_set(tb)?;
22        Ok(ByFnSetStmt::new(func, fn_set, tb.line_file.clone()).into())
23    }
24
25    /// `by tuple: <obj>` — tuple / ordered-pair definitional expansion.
26    pub fn parse_by_tuple_stmt(&mut self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
27        tb.skip_token(TUPLE)?;
28        tb.skip_token(COLON)?;
29        let obj = self.parse_obj(tb)?;
30        Ok(ByTupleStmt::new(obj, tb.line_file.clone()).into())
31    }
32}