You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.7 KiB
JavaScript
67 lines
1.7 KiB
JavaScript
/*!
|
|
* jsPOS
|
|
*
|
|
* Copyright 2010, Percy Wegmann
|
|
* Licensed under the GNU LGPLv3 license
|
|
* http://www.opensource.org/licenses/lgpl-3.0.html
|
|
*/
|
|
|
|
function LexerNode(string, regex, regexs){
|
|
this.string = string;
|
|
this.children = [];
|
|
if (string) {
|
|
this.matches = string.match(regex);
|
|
var childElements = string.split(regex);
|
|
}
|
|
if (!this.matches) {
|
|
this.matches = [];
|
|
var childElements = [string];
|
|
}
|
|
if (regexs.length > 0) {
|
|
var nextRegex = regexs[0];
|
|
var nextRegexes = regexs.slice(1);
|
|
for (var i in childElements) {
|
|
this.children.push(new LexerNode(childElements[i], nextRegex, nextRegexes));
|
|
}
|
|
}
|
|
else {
|
|
this.children = childElements;
|
|
}
|
|
}
|
|
|
|
LexerNode.prototype.fillArray = function(array){
|
|
for (var i in this.children) {
|
|
var child = this.children[i];
|
|
if (child.fillArray)
|
|
child.fillArray(array);
|
|
else if (/[^ \t\n\r]+/i.test(child))
|
|
array.push(child);
|
|
if (i < this.matches.length) {
|
|
var match = this.matches[i];
|
|
if (/[^ \t\n\r]+/i.test(match))
|
|
array.push(match);
|
|
}
|
|
}
|
|
}
|
|
|
|
LexerNode.prototype.toString = function(){
|
|
var array = [];
|
|
this.fillArray(array);
|
|
return array.toString();
|
|
}
|
|
|
|
function Lexer(){
|
|
// Split by numbers, then whitespace, then punctuation
|
|
this.regexs = [/[0-9]*\.[0-9]+|[0-9]+/ig, /[ \t\n\r]+/ig, /[\.\,\?\!]/ig];
|
|
}
|
|
|
|
Lexer.prototype.lex = function(string){
|
|
var array = [];
|
|
var node = new LexerNode(string, this.regexs[0], this.regexs.slice(1));
|
|
node.fillArray(array);
|
|
return array;
|
|
}
|
|
|
|
//var lexer = new Lexer();
|
|
//print(lexer.lex("I made $5.60 today in 1 hour of work. The E.M.T.'s were on time, but only barely.").toString());
|