WebAssembly bindings for Parsing Toys - an educational tool for visualizing Context-Free Grammar (CFG) parsing algorithms.
npm install parsing-toysWebAssembly bindings for Parsing Toys - an educational tool for visualizing Context-Free Grammar (CFG) parsing algorithms.
``bash`
npm install parsing-toys
`javascript
import { ContextFreeGrammar } from 'parsing-toys';
// Parse a grammar
const cfg = new ContextFreeGrammar();
cfg.parse(
E -> E + T | T
T -> T * F | F
F -> ( E ) | id);
console.log(cfg.toString());
// Get terminals and non-terminals
console.log('Terminals:', cfg.terminals());
console.log('Non-terminals:', cfg.nonTerminals());
`
`javascript
import { ContextFreeGrammar } from 'parsing-toys';
const cfg = new ContextFreeGrammar();
cfg.parse(
S -> a B | a C
B -> b
C -> c);
cfg.leftFactoring(false);
console.log('After left factoring:');
console.log(cfg.toString());
`
`javascript
import { ContextFreeGrammar } from 'parsing-toys';
const cfg = new ContextFreeGrammar();
cfg.parse(
E -> T E'
E' -> + T E' | ε
T -> F T'
T' -> * F T' | ε
F -> ( E ) | id);
const ff = cfg.computeFirstAndFollowSet();
for (let i = 0; i < ff.size(); i++) {
const symbol = ff.symbolAt(i);
console.log(${symbol}:); FIRST: ${ff.getFirstSet(symbol)}
console.log(); FOLLOW: ${ff.getFollowSet(symbol)}
console.log();`
}
`javascript
import { ContextFreeGrammar } from 'parsing-toys';
const cfg = new ContextFreeGrammar();
cfg.parse(
E -> T E'
E' -> + T E' | ε
T -> F T'
T' -> * F T' | ε
F -> ( E ) | id);
const table = cfg.computeLL1Table();
console.log('Has conflict:', table.hasConflict());
const steps = table.parse('id + id * id');
for (let i = 0; i < steps.size(); i++) {
console.log(steps.getAction(i));
}
`
`javascript
import { ContextFreeGrammar } from 'parsing-toys';
const cfg = new ContextFreeGrammar();
cfg.parse(
E -> E + T | T
T -> T * F | F
F -> ( E ) | id);
// SLR(1) parsing
const automaton = cfg.computeSLR1Automaton();
const table = cfg.computeSLR1ActionGotoTable(automaton);
console.log('Has conflict:', table.hasConflict());
const steps = table.parse('id + id * id');
for (let i = 0; i < steps.size(); i++) {
console.log(steps.getAction(i));
}
// Get parse tree SVG
const parseTree = table.getParseTree();
if (parseTree) {
const svg = parseTree.toSVG();
console.log(svg);
}
`
`javascript
import { ContextFreeGrammar } from 'parsing-toys';
const cfg = new ContextFreeGrammar();
cfg.parse(
S -> A B
A -> a
B -> b);
// Convert to Chomsky Normal Form
cfg.toChomskyNormalForm();
console.log('Is CNF:', cfg.isChomskyNormalForm());
// Parse using CYK algorithm
const result = cfg.cykParse('a b');
console.log('Accepted:', result.isAccepted());
`
`javascript
import { RegularExpression } from 'parsing-toys';
const re = new RegularExpression();
re.parse('(a|b)*abb');
// Convert to NFA
const nfa = re.toNFA();
const nfaGraph = RegularExpression.toNFAGraph(nfa);
console.log('NFA states:', nfaGraph.size());
// Convert to DFA
const dfa = RegularExpression.toDFA(nfa);
const dfaGraph = RegularExpression.toDFAGraph(dfa);
console.log('DFA states:', dfaGraph.size());
// Minimize DFA
const minDfa = RegularExpression.toMinDFA(dfa);
const minDfaGraph = RegularExpression.toDFAGraph(minDfa);
console.log('Minimized DFA states:', minDfaGraph.size());
// Generate SVG visualization
const svg = nfaGraph.toSVG();
console.log(svg);
`
- parse(code: string): boolean - Parse a grammar stringerrorMessage(): string
- - Get error message if parsing failedtoString(): string
- - Get formatted grammar stringterminals(): string[]
- - Get all terminalsnonTerminals(): string[]
- - Get all non-terminalsleftFactoring(expand: boolean): void
- - Perform left factoringleftRecursionElimination(): boolean
- - Eliminate left recursioncomputeFirstAndFollowSet(): FirstAndFollowSet
- - Compute FIRST and FOLLOW setscomputeLL1Table(): MTable
- - Compute LL(1) parsing tablecomputeLR0Automaton(): FiniteAutomaton
- - Compute LR(0) automatoncomputeLR0ActionGotoTable(automaton): ActionGotoTable
- - Compute LR(0) ACTION/GOTO tablecomputeSLR1Automaton(): FiniteAutomaton
- - Compute SLR(1) automatoncomputeSLR1ActionGotoTable(automaton): ActionGotoTable
- - Compute SLR(1) ACTION/GOTO tablecomputeLR1Automaton(): FiniteAutomaton
- - Compute LR(1) automatoncomputeLR1ActionGotoTable(automaton): ActionGotoTable
- - Compute LR(1) ACTION/GOTO tablecomputeLALR1Automaton(): FiniteAutomaton
- - Compute LALR(1) automatoncomputeLALR1ActionGotoTable(automaton): ActionGotoTable
- - Compute LALR(1) ACTION/GOTO tabletoChomskyNormalForm(): void
- - Convert grammar to CNFisChomskyNormalForm(): boolean
- - Check if grammar is in CNFcykParse(input: string): CYKTable
- - Parse using CYK algorithm
- parse(pattern: string): boolean - Parse a regular expressionerrorMessage(): string
- - Get error message if parsing failedtoNFA(): NFAState
- - Convert to NFAstatic toDFA(nfa: NFAState): DFAState
- - Convert NFA to DFAstatic toMinDFA(dfa: DFAState): DFAState
- - Minimize DFAstatic toNFAGraph(nfa: NFAState): NFAGraph
- - Convert NFA to graphstatic toDFAGraph(dfa: DFAState): DFAGraph` - Convert DFA to graph
-
MIT License