macro_rules! wrap { ($pos:literal => $left:ident; $internal:ident; $right:ident ) => { ... }; ($pos:literal => $left:ident; $internal:ident ?; $right:ident ) => { ... }; ($pos:literal => $left:ident; $internal:ident or $default:ident; $right:ident ) => { ... }; ($pos:literal => $left:ident; $internal:ident or $default:literal; $right:ident ) => { ... }; ($pos:ident => $left:ident; $internal:ident; $right:ident ) => { ... }; ($pos:ident => $left:ident; $internal:ident ?; $right:ident ) => { ... }; ($pos:ident => $left:ident; $internal:ident or $default:ident; $right:ident ) => { ... }; ($pos:ident => $left:ident; $internal:ident or $default:literal; $right:ident ) => { ... }; }
Expand description
Helps to parse a wrapper
<rule> ::= '(' "value" ')'
Examples
use logos::Logos;
use crate::parsit::parser::Parsit;
use crate::parsit::wrap;
use crate::parsit::token;
use crate::parsit::step::Step;
use crate::parsit::parser::EmptyToken;
#[derive(Logos,PartialEq)]
pub enum TFQ {
#[token("(")]
L,
#[token(")")]
R,
#[token("word")]
Word,
#[token("none")]
None,
}
let p:Parsit<TFQ> = Parsit::new("(word)").unwrap();
let left = |pos:usize|{token!(p.token(pos) => TFQ::L)};
let right = |pos:usize|{token!(p.token(pos) => TFQ::R)};
let word = |pos:usize|{token!(p.token(pos) => TFQ::Word)};
let pos = 0;
wrap!(pos => left ; word; right );
let p:Parsit<TFQ> = Parsit::new("()").unwrap();
let word = |pos:usize|{token!(p.token(pos) => TFQ::Word).or_none()};
wrap!(0 => left ; word ?; right );
let p:Parsit<TFQ> = Parsit::new("()").unwrap();
let word = |pos:usize|{token!(p.token(pos) => TFQ::Word => 1)};
wrap!(0 => left ; word or 0; right ).print();