summaryrefslogtreecommitdiff
path: root/src/parser.rs
diff options
context:
space:
mode:
authorMike Buland <mike@xagasoft.com>2026-06-08 15:07:12 -0700
committerMike Buland <mike@xagasoft.com>2026-06-08 15:07:12 -0700
commita9172970548805db45188a352b2aafbc0e7b32e3 (patch)
treecf674f3ea9ebc023a6795f7a8e12a8157efd5c8f /src/parser.rs
parent3e60b2746bb95cfcd9b7fa4b7ed9e1c72259fb23 (diff)
downloadcrimtag-a9172970548805db45188a352b2aafbc0e7b32e3.tar.gz
crimtag-a9172970548805db45188a352b2aafbc0e7b32e3.tar.bz2
crimtag-a9172970548805db45188a352b2aafbc0e7b32e3.tar.xz
crimtag-a9172970548805db45188a352b2aafbc0e7b32e3.zip
It works! Lots to do, but it works.
We have a lot of cleanup to do, remove debugging prints, and make it easier to use other structures and complex variable references, etc.
Diffstat (limited to 'src/parser.rs')
-rw-r--r--src/parser.rs31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/parser.rs b/src/parser.rs
index 1591c8b..aff64f6 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -10,6 +10,15 @@ pub struct ParseError {
10 what: String, 10 what: String,
11} 11}
12 12
13impl ParseError {
14 pub fn new( position: Position, what: &str ) -> Self {
15 ParseError {
16 position,
17 what: what.to_string(),
18 }
19 }
20}
21
13impl fmt::Display for ParseError { 22impl fmt::Display for ParseError {
14 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
15 write!(f, "Error parsing input: {}", "yeah") 24 write!(f, "Error parsing input: {}", "yeah")
@@ -85,7 +94,7 @@ impl<'a> SymbolHelper for Option<Symbol<'a>> {
85 if let Some(st) = self { 94 if let Some(st) = self {
86 Ok(match st.symbol() { 95 Ok(match st.symbol() {
87 SymbolType::Token(_) | 96 SymbolType::Token(_) |
88 SymbolType::Fragment | 97 SymbolType::View |
89 SymbolType::Output | 98 SymbolType::Output |
90 SymbolType::Show => true, 99 SymbolType::Show => true,
91 _ => false 100 _ => false
@@ -127,7 +136,7 @@ pub struct Parser {
127 * close_tag: '<|' token '|]' 136 * close_tag: '<|' token '|]'
128 * ; 137 * ;
129 * 138 *
130 * tag_guts: 'fragment' literal props 139 * tag_guts: 'view' literal props
131 * | 'section' literal 140 * | 'section' literal
132 * | 'output' literal 141 * | 'output' literal
133 * ; 142 * ;
@@ -167,7 +176,7 @@ pub struct Parser {
167 * close_tag: '<|' token '|]' 176 * close_tag: '<|' token '|]'
168 * ; 177 * ;
169 * 178 *
170 * tag_guts: 'fragment' literal props 179 * tag_guts: 'view' literal props
171 * | 'section' literal 180 * | 'section' literal
172 * | 'output' literal 181 * | 'output' literal
173 * ; 182 * ;
@@ -216,7 +225,7 @@ impl Parser {
216 match ctx.cur().unwrap().symbol() { 225 match ctx.cur().unwrap().symbol() {
217 SymbolType::Text(_) => { /* Skip top level text */ } 226 SymbolType::Text(_) => { /* Skip top level text */ }
218 SymbolType::StartFlat => { 227 SymbolType::StartFlat => {
219 children.push( self.parse_tag_fragment( ctx )? ); 228 children.push( self.parse_tag_view( ctx )? );
220 } 229 }
221 SymbolType::Error{..} => { 230 SymbolType::Error{..} => {
222 return self.lex_error( &ctx.cur().unwrap() ); 231 return self.lex_error( &ctx.cur().unwrap() );
@@ -230,9 +239,9 @@ impl Parser {
230 Ok(Token::Root(children)) 239 Ok(Token::Root(children))
231 } 240 }
232 241
233 fn parse_tag_fragment(&self, ctx: &mut Context) -> ParseResult<Token> { 242 fn parse_tag_view(&self, ctx: &mut Context) -> ParseResult<Token> {
234 let mut tb = self.parse_open_tag( ctx )?; 243 let mut tb = self.parse_open_tag( ctx )?;
235 if !tb.is_name( &SymbolType::Fragment ) { 244 if !tb.is_name( &SymbolType::View ) {
236 return Err(ParseError{ 245 return Err(ParseError{
237 position: tb.start_pos(), 246 position: tb.start_pos(),
238 what: "Unexpected tag type, only frament allowed at root".to_string(), 247 what: "Unexpected tag type, only frament allowed at root".to_string(),
@@ -244,7 +253,7 @@ impl Parser {
244 } 253 }
245 let mut children = Vec::new(); 254 let mut children = Vec::new();
246 255
247 println!("--parse-tag-fragment-- tag parsed, next token: {:?}", ctx.cur() ); 256 println!("--parse-tag-view-- tag parsed, next token: {:?}", ctx.cur() );
248 loop { 257 loop {
249 if ctx.cur().is_none() { 258 if ctx.cur().is_none() {
250 return Err(ParseError{ 259 return Err(ParseError{
@@ -328,7 +337,7 @@ impl Parser {
328 337
329 if ctx.next().is_some() { 338 if ctx.next().is_some() {
330 match ctx.cur().unwrap().symbol() { 339 match ctx.cur().unwrap().symbol() {
331 SymbolType::Fragment | SymbolType::Show | 340 SymbolType::View | SymbolType::Show |
332 SymbolType::Output => { 341 SymbolType::Output => {
333 let name_sym = ctx.cur().unwrap(); 342 let name_sym = ctx.cur().unwrap();
334 ctx.next(); 343 ctx.next();
@@ -532,7 +541,7 @@ impl<'a> TagBuilder<'a> {
532 } 541 }
533 } 542 }
534 543
535 pub fn name(&self) -> Option<Symbol> { 544 pub fn name(&self) -> Option<Symbol<'a>> {
536 self.name 545 self.name
537 } 546 }
538 547
@@ -570,8 +579,8 @@ impl<'a> TagBuilder<'a> {
570 pub fn build(mut self) -> ParseResult<Token> { 579 pub fn build(mut self) -> ParseResult<Token> {
571 if let Some(sym) = self.name { 580 if let Some(sym) = self.name {
572 match sym.symbol() { 581 match sym.symbol() {
573 SymbolType::Fragment => { 582 SymbolType::View => {
574 Ok(Token::Fragment(self.params.swap_remove(0), self.props, self.children)) 583 Ok(Token::View(self.params.swap_remove(0), self.props, self.children))
575 } 584 }
576 SymbolType::Output => { 585 SymbolType::Output => {
577 Ok(Token::Output(self.params.swap_remove(0), self.props, self.children)) 586 Ok(Token::Output(self.params.swap_remove(0), self.props, self.children))