diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-21 13:01:28 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-22 17:53:49 +0200 |
commit | 458afaa9b725b295fc634121350da547cf668f25 (patch) | |
tree | 289f781aa1faf3cfc57ea53fc61a2c1e35f1be94 /crates/rebel-parse/src/lib.rs | |
parent | 65ebd7525f9cbb93450a104d9e9a635c7f1ef104 (diff) | |
download | rebel-458afaa9b725b295fc634121350da547cf668f25.tar rebel-458afaa9b725b295fc634121350da547cf668f25.zip |
rebel-parse: Initial RecipeLang parser implementation
Parse a recipe into an AST. No span support yet.
Diffstat (limited to 'crates/rebel-parse/src/lib.rs')
-rw-r--r-- | crates/rebel-parse/src/lib.rs | 68 |
1 files changed, 4 insertions, 64 deletions
diff --git a/crates/rebel-parse/src/lib.rs b/crates/rebel-parse/src/lib.rs index d9a59cf..8019d00 100644 --- a/crates/rebel-parse/src/lib.rs +++ b/crates/rebel-parse/src/lib.rs @@ -1,65 +1,5 @@ -use rebel_common::types::TaskIDRef; +pub mod ast; +mod grammar; -pub use rules::*; - -#[derive(Debug, Clone, Copy)] -pub struct TaskRef<'a> { - pub id: TaskIDRef<'a>, - pub args: TaskArgs<'a>, -} - -#[derive(Debug, Clone, Copy, Default)] -pub struct TaskArgs<'a> { - pub host: Option<&'a str>, - pub target: Option<&'a str>, -} - -#[derive(Debug, Clone, Copy)] -pub struct TaskFlags { - pub force_run: bool, -} - -peg::parser! { - grammar rules() for str { - pub rule task_ref_with_flags() -> (TaskRef<'input>, TaskFlags) - = task:task_ref() flags:task_flags() { (task, flags) } - - pub rule task_ref() -> TaskRef<'input> - = id:task_id() args:task_args() { - TaskRef { - id, - args, - } - } - - rule recipe_id() -> &'input str - = $(name() ("/" name())?) - - rule task_id() -> TaskIDRef<'input> - = recipe:recipe_id() "::" task:name() { - TaskIDRef { recipe, task } - } - - rule task_args() -> TaskArgs<'input> - = "@" host:name()? target:tagged(<":">, <name()>)? { - TaskArgs { - host, - target, - } - } - / { Default::default() } - - rule task_flags() -> TaskFlags - = force_run:force_run() { TaskFlags { force_run } } - - rule force_run() -> bool - = "+" { true } - / { false } - - rule name() -> &'input str - = $(['a'..='z' | 'A' ..='Z' | '0'..='9' | '_' | '-']+) - - rule tagged<T>(tag: rule<()>, value: rule<T>) -> T - = tag() v:value() { v } - } -} +pub use grammar::recipe; +pub use grammar::task_ref; |