diff --git a/docsite/site/content/reference/grammar.md b/docsite/site/content/reference/grammar.md index c3303b3..b2d0d9f 100644 --- a/docsite/site/content/reference/grammar.md +++ b/docsite/site/content/reference/grammar.md @@ -44,9 +44,10 @@ rbracket: "]" ; lparen: "(" ; rparen: ")" ; bareword: ASCII_CHAR, { DIGIT | VISIBLE_CHAR | "_" } ; -let_keyword: "let" [WS] ; -import_keyword: "import" [WS]; -as_keyword: "as" [WS]; +let_keyword: "let" ; +import_keyword: "import" ; +include_keyword: "include" ; +as_keyword: "as" ; macro_keyword: "macro" ; module_keyword: "module" ; mod_keyword: "mod" ; @@ -134,6 +135,12 @@ call_expression: bareword, lparen, [arglist], rparen ; format_expr: str, percent, lparen, [arglist], rparen ; ``` +#### Include Expression + +``` +include_expr: include_keyword, bareword, str ; +``` + #### Non Operator Expression ``` @@ -142,6 +149,7 @@ non_operator_expr: literal | macrodef | module_def | format_expression + | include_expression | copy_expression | call_expression ; ``` diff --git a/integration_tests/include_example.sh b/integration_tests/include_example.sh new file mode 100644 index 0000000..05c4fa9 --- /dev/null +++ b/integration_tests/include_example.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +echo "included" \ No newline at end of file diff --git a/integration_tests/include_test.ucg b/integration_tests/include_test.ucg new file mode 100644 index 0000000..b5e8879 --- /dev/null +++ b/integration_tests/include_test.ucg @@ -0,0 +1,5 @@ +let script = include str "./include_example.sh"; +assert | + script == "#!/usr/bin/env bash +echo \"included\""; +|; \ No newline at end of file diff --git a/src/ast/mod.rs b/src/ast/mod.rs index a8e921a..4cfbaf7 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -457,15 +457,10 @@ impl MacroDef { let mut syms_set = self.validate_value_symbols(&mut stack, val); bad_symbols.extend(syms_set.drain()); } - &Expression::Macro(_) => { - // noop - continue; - } - &Expression::Module(_) => { - // noop - continue; - } - &Expression::ListOp(_) => { + &Expression::Macro(_) + | &Expression::Module(_) + | &Expression::ListOp(_) + | &Expression::Include(_) => { // noop continue; } @@ -551,6 +546,14 @@ pub struct FormatDef { pub pos: Position, } +/// Encodes an import statement in the UCG AST. +#[derive(Debug, PartialEq, Clone)] +pub struct IncludeDef { + pub pos: Position, + pub path: Token, + pub typ: Token, +} + /// Encodes a list expression in the UCG AST. #[derive(Debug, PartialEq, Clone)] pub struct ListDef { @@ -625,6 +628,7 @@ pub enum Expression { // TODO(jwall): This should really store it's position :-( Grouped(Box), Format(FormatDef), + Include(IncludeDef), Call(CallDef), Macro(MacroDef), Select(SelectDef), @@ -646,6 +650,7 @@ impl Expression { &Expression::Module(ref def) => &def.pos, &Expression::Select(ref def) => &def.pos, &Expression::ListOp(ref def) => &def.pos, + &Expression::Include(ref def) => &def.pos, } } } @@ -683,6 +688,9 @@ impl fmt::Display for Expression { &Expression::Select(_) => { write!(w, "