diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-19 23:32:57 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-20 17:12:02 +0200 |
commit | 801f049969be0ca907b74e53597bec33cba97af4 (patch) | |
tree | 5d3c0f5103d605c9b92aee198f4511e4b418abee | |
parent | 334f764cbffa8d591a007f0fec962f58cf0efde4 (diff) | |
download | rebel-801f049969be0ca907b74e53597bec33cba97af4.tar rebel-801f049969be0ca907b74e53597bec33cba97af4.zip |
driver: parse: improve some rule and type names, order from high-level to low-level
-rw-r--r-- | crates/rebel-parse/src/lib.rs | 47 | ||||
-rw-r--r-- | crates/rebel-resolve/src/context.rs | 2 |
2 files changed, 23 insertions, 26 deletions
diff --git a/crates/rebel-parse/src/lib.rs b/crates/rebel-parse/src/lib.rs index 5857efb..fa72b42 100644 --- a/crates/rebel-parse/src/lib.rs +++ b/crates/rebel-parse/src/lib.rs @@ -1,4 +1,10 @@ #[derive(Debug, Clone, Copy)] +pub struct TaskRef<'a> { + pub id: TaskID<'a>, + pub args: TaskArgs<'a>, +} + +#[derive(Debug, Clone, Copy)] pub struct TaskID<'a> { pub recipe: &'a str, pub task: &'a str, @@ -11,26 +17,22 @@ pub struct TaskArgs<'a> { } #[derive(Debug, Clone, Copy)] -pub struct Task<'a> { - pub id: TaskID<'a>, - pub args: TaskArgs<'a>, -} - -#[derive(Debug, Clone, Copy)] pub struct TaskFlags { pub force_run: bool, } peg::parser! { grammar rules() for str { - rule t<T>(tag: rule<()>, value: rule<T>) -> T - = tag() v:value() { v } - - rule name_char() - = ['a'..='z' | 'A' ..='Z' | '0'..='9' | '_' | '-'] + pub rule task_ref_with_flags() -> (TaskRef<'input>, TaskFlags) + = task:task_ref() flags:task_flags() { (task, flags) } - rule name() -> &'input str - = $(name_char()+) + pub rule task_ref() -> TaskRef<'input> + = id:task_id() args:task_args() { + TaskRef { + id, + args, + } + } rule recipe_id() -> &'input str = $(name() ("/" name())?) @@ -41,7 +43,7 @@ peg::parser! { } rule task_args() -> TaskArgs<'input> - = "@" host:name()? target:t(<":">, <name()>)? { + = "@" host:name()? target:tagged(<":">, <name()>)? { TaskArgs { host, target, @@ -49,23 +51,18 @@ peg::parser! { } / { Default::default() } - pub rule task() -> Task<'input> - = id:task_id() args:task_args() { - Task { - id, - args, - } - } + rule task_flags() -> TaskFlags + = force_run:force_run() { TaskFlags { force_run } } rule force_run() -> bool = "+" { true } / { false } - rule task_flags() -> TaskFlags - = force_run:force_run() { TaskFlags { force_run } } + rule name() -> &'input str + = $(['a'..='z' | 'A' ..='Z' | '0'..='9' | '_' | '-']+) - pub rule task_with_flags() -> (Task<'input>, TaskFlags) - = task:task() flags:task_flags() { (task, flags) } + rule tagged<T>(tag: rule<()>, value: rule<T>) -> T + = tag() v:value() { v } } } diff --git a/crates/rebel-resolve/src/context.rs b/crates/rebel-resolve/src/context.rs index b8090d1..88d5deb 100644 --- a/crates/rebel-resolve/src/context.rs +++ b/crates/rebel-resolve/src/context.rs @@ -363,7 +363,7 @@ impl Context { } pub fn parse(&self, s: &str) -> error::Result<(TaskRef, TaskFlags)> { - let (parsed, flags) = parse::task_with_flags(s) + let (parsed, flags) = parse::task_ref_with_flags(s) .ok() .context("Invalid task syntax")?; |