Work in progress on generic parser
This commit is contained in:
@@ -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));
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user