Skip to main content

litex/parse/
parse_tooling_stmt.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn parse_import_stmt(&self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
5        tb.skip_token(IMPORT)?;
6        if tb.current_token_is_equal_to(DOUBLE_QUOTE) {
7            tb.skip_token(DOUBLE_QUOTE)?;
8            let mut path_parts: Vec<String> = vec![];
9            while tb.current()? != DOUBLE_QUOTE {
10                path_parts.push(tb.advance()?);
11            }
12            tb.skip_token(DOUBLE_QUOTE)?;
13            let path = path_parts.join("");
14            let as_mod_name = if tb.current_token_is_equal_to(AS) {
15                tb.skip_token(AS)?;
16                Some(tb.advance()?)
17            } else {
18                None
19            };
20            Ok(ImportStmt::ImportRelativePath(ImportRelativePathStmt::new(
21                path,
22                as_mod_name,
23                tb.line_file.clone(),
24            ))
25            .into())
26        } else {
27            let mod_name = tb.advance()?;
28            let as_mod_name = if tb.current_token_is_equal_to(AS) {
29                tb.skip_token(AS)?;
30                Some(tb.advance()?)
31            } else {
32                None
33            };
34            Ok(ImportStmt::ImportGlobalModule(ImportGlobalModuleStmt::new(
35                mod_name,
36                as_mod_name,
37                tb.line_file.clone(),
38            ))
39            .into())
40        }
41    }
42
43    pub fn parse_do_nothing_stmt(&self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
44        if tb.current()? == DOT_DOT_DOT {
45            tb.skip_token(DOT_DOT_DOT)?;
46        } else {
47            tb.skip_token(DO_NOTHING)?;
48        }
49        Ok(DoNothingStmt::new(tb.line_file.clone()).into())
50    }
51
52    pub fn parse_clear_stmt(&self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
53        tb.skip_token(CLEAR)?;
54        Ok(ClearStmt::new(tb.line_file.clone()).into())
55    }
56
57    pub fn parse_run_file_stmt(&self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
58        tb.skip_token(RUN_FILE)?;
59        tb.skip_token(DOUBLE_QUOTE)?;
60        let mut path_parts: Vec<String> = vec![];
61        while tb.current()? != DOUBLE_QUOTE {
62            path_parts.push(tb.advance()?);
63        }
64        tb.skip_token(DOUBLE_QUOTE)?;
65        let file_path = path_parts.join("");
66        Ok(RunFileStmt::new(file_path, tb.line_file.clone()).into())
67    }
68}