From 30476493726d776d7ba79b4301d17563c91196b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20L=C3=B6vqvist?= Date: Mon, 4 May 2026 22:24:48 +0200 Subject: [PATCH] Work in progress on generic parser --- experiments/generic-parser-2.mjs | 136 +++++++++++++++++++++++++++++++ source/table/table.mjs | 8 ++ 2 files changed, 144 insertions(+) diff --git a/experiments/generic-parser-2.mjs b/experiments/generic-parser-2.mjs index e69de29..3f87f29 100644 --- a/experiments/generic-parser-2.mjs +++ b/experiments/generic-parser-2.mjs @@ -0,0 +1,136 @@ +import { Row_Based_Table } from '@efforting.tech/table'; +import { load_raster_table } from '@efforting.tech/table/raster-table'; +import { RegExp_Tokenizer } from '@efforting.tech/parsing/regexp-dispatch'; +import { RegExp_Token_Parsing_Rule, Parser } from '@efforting.tech/parsing/generic-parsing'; + + +function load_table(raster) { + const table = load_raster_table(raster, Row_Based_Table); + table.replace_all_cells(({cell}) => cell.trim()); + return table; +} + +const logic_ops = load_table(` + + name symbol + ---- ------ + AND ∧ + OR ∨ + XOR ⊕ + NAND ↑ + NOR ↓ + XNOR ⊙ + IMPLIES → + IFF ↔ + NOT ¬ + +`); + +const generic_ops = load_table(` + + name symbol + ---- ------ + PLUS + + HYPHEN - + DOT · + ASTERISK * + CROSS × + SLASH / + CARET ^ + UNDERSCORE _ + PERCENT % + +`); + +const punctuation = load_table(` + + name symbol + ---- ------ + COMMA , + SEMI_COLON ; + COLON : + PERIOD . + +`); + +const grouping = load_table(` + + name left right + ---- ---- ----- + PARENTESIS ( ) + SQUARE_BRACKET [ ] + CURLY_BRACE { } + ANGLE_BRACKET ⟨ ⟩ + DOUBLE_ARROW_BRACKET « » + +`); + +const greek_chars = load_table(` + + name lower upper + ---- ----- ----- + ALPHA α Α + BETA β Β + GAMMA γ Γ + DELTA δ Δ + EPSILON ε Ε + ZETA ζ Ζ + ETA η Η + THETA θ Θ + IOTA ι Ι + KAPPA κ Κ + LAMBDA λ Λ + MU μ Μ + NU ν Ν + XI ξ Ξ + OMICRON ο Ο + PI π Π + RHO ρ Ρ + SIGMA σ Σ + TAU τ Τ + UPSILON υ Υ + PHI φ Φ + CHI χ Χ + PSI ψ Ψ + OMEGA ω Ω + +`); + + + +const rt = new RegExp_Tokenizer(); + +for (const { name, left, right } of grouping.iter_objects()) { + rt.add_rules(new RegExp_Token_Parsing_Rule(RegExp.escape(left), + (tokenizer, match) => tokenizer.enter_sub_tokenizer(undefined, + (tokenizer, value) => tokenizer.push_token( + {kind: 'grouping', name, value} + ) + ), `LEFT_${name}` + )); + + rt.add_rules(new RegExp_Token_Parsing_Rule(RegExp.escape(right), + (tokenizer, match) => tokenizer.leave_sub_tokenizer(), `RIGHT_${name}`) + ); +} + + +for (const table of [logic_ops, generic_ops, punctuation]) { + for (const { name, symbol } of table.iter_objects()) { + rt.add_rules(new RegExp_Token_Parsing_Rule(RegExp.escape(symbol), + (tokenizer, match) => tokenizer.push_token(match.value), name) + ); + } +} + +for (const { name, lower, upper } of greek_chars.iter_objects()) { + rt.add_rules(new RegExp_Token_Parsing_Rule(RegExp.escape(lower), + (tokenizer, match) => tokenizer.push_token(match.value), `LOWER_${name}`) + ); + rt.add_rules(new RegExp_Token_Parsing_Rule(RegExp.escape(upper), + (tokenizer, match) => tokenizer.push_token(match.value), `UPPER_${name}`) + ); +} + + +console.log(rt.rules.at(-1)); \ No newline at end of file diff --git a/source/table/table.mjs b/source/table/table.mjs index 34d23f2..e963374 100644 --- a/source/table/table.mjs +++ b/source/table/table.mjs @@ -146,12 +146,20 @@ export class Row_Based_Table { } + //TODO: Implement map and other functions expected by collections + *[Symbol.iterator]() { for (const index of this.rows.keys()) { yield new Table_Row_Reference(this, index); } } + *iter_objects() { + for (const index of this.rows.keys()) { + yield new Table_Row_Reference(this, index).object; + } + } + }