Skip to main content

oni_comb_parser/text/
lexeme.rs

1use crate::combinator::zip_left::ZipLeft;
2use crate::parser::Parser;
3use crate::parser_ext::ParserExt;
4use crate::primitive::take_while0::TakeWhile0;
5use crate::str_input::StrInput;
6use crate::text::take_while::take_while0;
7
8fn is_ws(c: char) -> bool {
9  c.is_ascii_whitespace()
10}
11
12/// `lexeme` の戻り値型。
13pub type Lexeme<'a, P> = ZipLeft<P, TakeWhile0<fn(char) -> bool, StrInput<'a>>>;
14
15/// パーサーを実行した後に後続の空白を消費するトークンラッパー。
16///
17/// ```ignore
18/// let lbrace = lexeme(char('{'));
19/// let number = lexeme(integer());
20/// ```
21pub fn lexeme<'a, P>(parser: P) -> Lexeme<'a, P>
22where
23  P: Parser<StrInput<'a>, Error = crate::error::ParseError>, {
24  parser.zip_left(take_while0(is_ws as fn(char) -> bool))
25}