summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2024-04-24 23:29:37 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2024-04-24 23:38:34 +0200
commite2c6edc6dc88ab805b9d71ae8052298ae961d5ec (patch)
treec0c93ec95d6208e80eadf96c7f472936342fddd7
parentfe4ce14fe64ab05318c0c66317a6d4f5578127fc (diff)
downloadrebel-e2c6edc6dc88ab805b9d71ae8052298ae961d5ec.tar
rebel-e2c6edc6dc88ab805b9d71ae8052298ae961d5ec.zip
rebel-parse: token: separate Number from String variants
-rw-r--r--crates/rebel-parse/src/grammar/recipe.rs10
-rw-r--r--crates/rebel-parse/src/grammar/tokenize.rs21
-rw-r--r--crates/rebel-parse/src/token.rs10
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,