UNPKG

@parser-generator/grammar-interpreter

Version:

A Parser Generator that supports LL,SLR,LR1,LALR

53 lines 1.82 kB
import { NonTerminal, TokenPro, Production, SymbolWrapper, NIL, EOF } from "@parser-generator/definition"; import { Expr, Term, Factor } from "./ast"; export let digit = new TokenPro("digit"); let E = new NonTerminal("E"); let T = new NonTerminal("T"); let F = new NonTerminal("F"); /* (0) E->FT<%(e)=>new Expr(e)%> */ let p0 = new Production(0, E, [ new SymbolWrapper(F), new SymbolWrapper(T) ], undefined, (e) => new Expr(e)); /* (1) T->+FT<%(e)=>new Term(e)%> */ let p1 = new Production(1, T, [ new SymbolWrapper("+"), new SymbolWrapper(F), new SymbolWrapper(T) ], undefined, (e) => new Term(e)); /* (2) T->-FT<%(e)=>new Term(e)%> */ let p2 = new Production(2, T, [ new SymbolWrapper("-"), new SymbolWrapper(F), new SymbolWrapper(T) ], undefined, (e) => new Term(e)); /* (3) T->NIL<%(e)=>new Term(e)%> */ let p3 = new Production(3, T, [ new SymbolWrapper(NIL) ], undefined, (e) => new Term(e)); /* (4) F->digit<%(e)=>new Factor(e)%> */ let p4 = new Production(4, F, [ new SymbolWrapper(digit) ], undefined, (e) => new Factor(e)); /* (5) F->(E)<%(e)=>new Factor(e)%> */ let p5 = new Production(5, F, [ new SymbolWrapper("("), new SymbolWrapper(E), new SymbolWrapper(")") ], undefined, (e) => new Factor(e)); E.prods = [p0]; T.prods = [p1, p2, p3]; F.prods = [p4, p5]; /* first set */ let first = new Map(); first.set(E, new Map([[digit, p0], ["(", p0]])); first.set(T, new Map([["+", p1], ["-", p2], [NIL, p3]])); first.set(F, new Map([[digit, p4], ["(", p5]])); /* follow set */ let follow = new Map(); follow.set(E, new Set([EOF, ")"])); follow.set(T, new Set([EOF, ")"])); follow.set(F, new Set(["+", "-", EOF, ")"])); import { LLParser } from "@parser-generator/core"; export let parser = new LLParser(E, first, follow); //# sourceMappingURL=parser.tmp.js.map