@parser-generator/grammar-interpreter
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
69 lines (66 loc) • 1.74 kB
JavaScript
import { EOF } from "@parser-generator/definition";
import { LRParser } from "@parser-generator/core";
import LTable from "./left";
import RTable from "./right";
/*
#GRAMMAR
S -> Stmt ;
Stmt -> If | Other <% (e)=>e[0] %> ;
If ->
'if' Expr Stmt |
'if' Expr Stmt 'else' Stmt
<% (e)=> new IfStmt(e) %>;
Expr -> 'Expr' <% (e)=>e[0] %>;
Other -> 'Other' <% (e)=>e[0] %>;
#GRAMMAR
S -> Stmt ;
Stmt -> If | Other <% (e)=>e[0] %> ;
If ->
'if' Expr Stmt |
'if' Expr Stmt 'else' Stmt
<% (e)=> new IfStmt(e) %>;
Expr -> 'Expr' <% (e)=>e[0] %>;
Other -> 'Other' <% (e)=>e[0] %>;
#SYMBOL_ASSOC_PREC
If left
*/
export class IfStmt {
constructor(children) {
this.children = children;
}
toString() {
return "(" + this.children.join(" ") + ")";
}
}
class Token {
constructor(lexeme) {
this.lexeme = lexeme;
}
key() {
return this.lexeme;
}
toString() {
return this.lexeme;
}
}
class Lexer {
constructor(lexemes) {
this.i = 0;
this.lexemes = lexemes;
}
peek() {
return this.i >= this.lexemes.length ? new Token(EOF) : new Token(this.lexemes[this.i]);
}
next() {
return this.i < this.lexemes.length ? new Token(this.lexemes[this.i++]) : new Token(EOF);
}
}
export let parser1 = new LRParser(LTable);
let ast1 = parser1.parse(new Lexer(["if", "Expr", "if", "Expr", "Other", "else", "Other"]));
console.log(ast1.toString());
//(if Expr (if Expr Other) else Other)
export let parser2 = new LRParser(RTable);
let ast2 = parser2.parse(new Lexer(["if", "Expr", "if", "Expr", "Other", "else", "Other"]));
console.log(ast2.toString());
//(if Expr (if Expr Other else Other))
//# sourceMappingURL=test.js.map