diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-24 23:29:37 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-24 23:38:34 +0200 |
commit | e2c6edc6dc88ab805b9d71ae8052298ae961d5ec (patch) | |
tree | c0c93ec95d6208e80eadf96c7f472936342fddd7 | |
parent | fe4ce14fe64ab05318c0c66317a6d4f5578127fc (diff) | |
download | rebel-e2c6edc6dc88ab805b9d71ae8052298ae961d5ec.tar rebel-e2c6edc6dc88ab805b9d71ae8052298ae961d5ec.zip |
rebel-parse: token: separate Number from String variants
-rw-r--r-- | crates/rebel-parse/src/grammar/recipe.rs | 10 | ||||
-rw-r--r-- | crates/rebel-parse/src/grammar/tokenize.rs | 21 | ||||
-rw-r--r-- | crates/rebel-parse/src/token.rs | 10 |
3 files changed, 21 insertions, 20 deletions
diff --git a/crates/rebel-parse/src/grammar/recipe.rs b/crates/rebel-parse/src/grammar/recipe.rs index d5400af..5df78b4 100644 --- a/crates/rebel-parse/src/grammar/recipe.rs +++ b/crates/rebel-parse/src/grammar/recipe.rs @@ -94,16 +94,16 @@ peg::parser! { rule literal() -> ast::Literal<'a> = keyword_true() { ast::Literal::Boolean(true) } / keyword_false() { ast::Literal::Boolean(false) } - / [Token::Literal(Literal { content, kind: LiteralKind::Number })] { ? + / [Token::Number(content)] { ? ast::Literal::number(content) } - / [Token::Literal(Literal { content, kind: LiteralKind::String })] { + / [Token::String(String { content, kind: StringKind::String })] { ast::Literal::String(content) } - / [Token::Literal(Literal { content, kind: LiteralKind::RawString })] { + / [Token::String(String { content, kind: StringKind::RawString })] { ast::Literal::RawString(content) } - / [Token::Literal(Literal { content, kind: LiteralKind::ScriptString })] { + / [Token::String(String { content, kind: StringKind::ScriptString })] { ast::Literal::ScriptString(content) } / p('(') p(')') { ast::Literal::Unit } @@ -127,7 +127,7 @@ peg::parser! { rule field() -> ast::Ident<'a> = ident() - / [Token::Literal(Literal {content, kind: LiteralKind::Number} )] { + / [Token::Number(content)] { ast::Ident { name: content } } diff --git a/crates/rebel-parse/src/grammar/tokenize.rs b/crates/rebel-parse/src/grammar/tokenize.rs index b497e23..826f4ce 100644 --- a/crates/rebel-parse/src/grammar/tokenize.rs +++ b/crates/rebel-parse/src/grammar/tokenize.rs @@ -8,7 +8,8 @@ peg::parser! { = _ tokens:(token() ** _) _ { tokens } pub rule token() -> Token<'input> - = literal:literal() { Token::Literal(literal) } + = number:number() { Token::Number(number) } + / string:string() { Token::String(string) } / ident:ident() { Token::Ident(ident) } / punct:punct() { Token::Punct(punct) } @@ -22,24 +23,24 @@ peg::parser! { = ch:punct_char() spacing:spacing() { Punct(ch, spacing) } rule punct_char() -> char - = !literal() !ident() !__ ch:[_] { ch } + = !number() !string() !ident() !__ ch:[_] { ch } rule spacing() -> Spacing = &punct_char() { Spacing::Joint } / { Spacing::Alone } - rule literal() -> Literal<'input> - = content:$(['0'..='9'] ['0'..='9' | 'a'..='z' | 'A'..='Z' | '_']*) { - Literal { content, kind: LiteralKind::Number } - } - / "\"" content:$(string_char()*) "\"" { - Literal { content, kind: LiteralKind::String } + rule number() -> &'input str + = $(['0'..='9'] ['0'..='9' | 'a'..='z' | 'A'..='Z' | '_']*) + + rule string() -> String<'input> + = "\"" content:$(string_char()*) "\"" { + String { content, kind: StringKind::String } } / "r\"" content:$([^'"']*) "\"" { - Literal { content, kind: LiteralKind::RawString } + String { content, kind: StringKind::RawString } } / "```" newline() content:$((!"```" [_])+) "```" { - Literal { content, kind: LiteralKind::ScriptString } + String { content, kind: StringKind::ScriptString } } rule string_char() diff --git a/crates/rebel-parse/src/token.rs b/crates/rebel-parse/src/token.rs index b985f74..5e6b741 100644 --- a/crates/rebel-parse/src/token.rs +++ b/crates/rebel-parse/src/token.rs @@ -2,7 +2,8 @@ pub enum Token<'a> { Ident(&'a str), Punct(Punct), - Literal(Literal<'a>), + String(String<'a>), + Number(&'a str), } #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -15,14 +16,13 @@ pub enum Spacing { } #[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub struct Literal<'a> { +pub struct String<'a> { pub content: &'a str, - pub kind: LiteralKind, + pub kind: StringKind, } #[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum LiteralKind { - Number, +pub enum StringKind { String, RawString, ScriptString, |