esther-medina-quintero-parser-nearley
Version:
63 lines (58 loc) • 1.36 kB
JavaScript
;
const SPACE = require('./tokens.js');
const fs = require('fs');
const nearley = require("nearley");
const grammar = require("./grammar.js");
const { lexer } = require('./lex.js');
// Check parenthesis balance
function parBalance(line) {
let stack = 0;
lexer.reset(line);
let tokens = lexer.tokens;
/// console.log(tokens);
for (let token of tokens) {
if (!token || token.type == "EOF") break;
if (token.type == "LP") stack++;
else if (token.type == "RP") stack--;
}
return stack;
}
function parse(p) {
// debugger
const parser = new nearley.Parser(nearley.Grammar.fromCompiled(grammar));
parser.feed(p);
const ast = parser.results[0];
return ast;
}
function parseFromFile(origin) {
// debugger
const parser = new nearley.Parser(nearley.Grammar.fromCompiled(grammar));
const source = fs.readFileSync(origin, { encoding: 'utf8' });
parser.feed(source);
const ast = parser.results[0];
return ast;
}
let getTokens = function(line) {
debugger;
lexer.reset(line);
let result = [], t = null;
do {
try {
t = lexer.next();
result.push(t);
} catch (e) {
console.error(e);
result.push({ type: "ERROR", text: e.message});
break;
}
} while(t);
return result;
}
module.exports = {
lex: lexer,
parse,
SPACE,
parseFromFile,
parBalance,
getTokens
}