import { RegExp_Tokenizer } from '@efforting.tech/parsing/regexp-dispatch'; import { RegExp_Token_Parsing_Rule, Parser } from '@efforting.tech/parsing/generic-parsing'; import { inspect } from 'node:util'; const text = 'Hello World (how are you (doing)) I may ask'; const rt = new RegExp_Tokenizer(); rt.add_rules(new RegExp_Token_Parsing_Rule(/\w+/, (tokenizer, match) => tokenizer.push_token(match.value), 'word')); rt.add_rules(new RegExp_Token_Parsing_Rule(/\s+/, null, 'space')); rt.add_rules(new RegExp_Token_Parsing_Rule(RegExp.escape('('), (tokenizer, match) => tokenizer.enter_sub_tokenizer(undefined, (tokenizer, value) => tokenizer.push_token({kind: 'sub expression', value}) ), 'lpar')); rt.add_rules(new RegExp_Token_Parsing_Rule(RegExp.escape(')'), (tokenizer, match) => tokenizer.leave_sub_tokenizer(), 'rpar')); const p = new Parser(text, { tokenizer: rt }); console.log(inspect(p.parse((tokenizer, value) => tokenizer.replace_value({kind: 'parsing result', value})), { colors: true, depth: null })); /* { kind: 'parsing result', value: [ 'Hello', 'World', { kind: 'sub expression', value: [ 'how', 'are', 'you', { kind: 'sub expression', value: [ 'doing' ] } ] }, 'I', 'may', 'ask' ] } */