UNPKG

treebank-parser

Version:

A simple parser for treebanks stored in S-Expressions

73 lines (61 loc) 1.95 kB
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; };