Files
nodejs.esm-library/experiments/generic-parser-1.mjs

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'
]
}
*/