treebank-parser
Version:
A simple parser for treebanks stored in S-Expressions
73 lines (61 loc) • 1.95 kB
JavaScript
var json_utils = require(__dirname + '/json-utils');
exports.lex_sexp = function(input) {
var regexp, symbols = [];
for (var i=0; i<input.length; i++) {
if ((regexp = (new RegExp('^\\s+')).exec(input.substring(i)))) {
i += regexp[0].length-1;
}
else if ((regexp = (new RegExp('^\\(')).exec(input.substring(i)))) {
symbols.push(regexp[0]);
}
else if ((regexp = (new RegExp('^[A-Za-z0-9_\\-\\$\\.\\,\\?\\!]+')).exec(input.substring(i)))) {
symbols.push(regexp[0]);
i += regexp[0].length-1;
}
else if ((regexp = (new RegExp('^\\)')).exec(input.substring(i)))) {
symbols.push(regexp[0]);
}
}
return symbols;
};
exports.convert_sexp_to_mexp = function(sexp_symbols) {
var swap = false, mexp_symbols = [];
for (var i=0; i<sexp_symbols.length; i++) {
if (sexp_symbols[i] === '(') {
swap = true;
}
else if (swap) {
mexp_symbols = mexp_symbols.concat([sexp_symbols[i], '(']);
swap = false;
}
else {
mexp_symbols.push(sexp_symbols[i]);
}
}
return mexp_symbols;
};
exports.convert_mexp_to_json = function(mexp_symbols) {
var symbol = null, root_count = 0, sentence_count = 0, tree = {}, properties = [];
for (var i=0; i<mexp_symbols.length; i++) {
if (mexp_symbols[i] === '(') {
properties.push(symbol);
json_utils.set_tree_value(tree, properties, {});
symbol = null;
}
else if (mexp_symbols[i] === ')') {
if (symbol !== null) {
json_utils.set_tree_value(tree, properties, json_utils.strip_duplicate_indicator(symbol));
symbol = null;
}
properties.pop();
}
else if (symbol === null) {
symbol = json_utils.get_property_name_for_duplicate(json_utils.get_node(tree, properties), mexp_symbols[i]);
}
else {
json_utils.set_tree_value(tree, properties.concat(symbol), mexp_symbols[i]);
symbol = null;
}
}
return tree;
};