litex/parse/
parse_tooling_stmt.rs1use 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}