41 lines
1.3 KiB
JavaScript
41 lines
1.3 KiB
JavaScript
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'
|
|
]
|
|
}
|
|
|
|
*/
|