//<script type="text/javascript">
-//imports['Object.js'].load(Object);
+
XObject = imports.XObject.XObject;
-console = imports['console.js'].console;
+console = imports.console.console;
-JSDOC = imports['JSDOC.js'].JSDOC;
-Token = imports['JSDOC/Token.js'].Token;
-Lang = imports['JSDOC/Lang.js'].Lang;
+
+Token = imports.Token.Token;
+Lang = imports.Lang.Lang;
/**
@class Search a {@link JSDOC.TextStream} for language tokens.
/**
- @type {JSDOC.Token[]}
+ * tokenize a stream
+ * @return {Array} of tokens
+ *
+ * ts = new TextStream(File.read(str));
+ * tr = TokenReader({ keepComments : true, keepWhite : true });
+ * tr.tokenize(ts)
+ *
*/
+
tokenize : function(/**JSDOC.TextStream*/stream) {
+ this.line =1;
var tokens = [];
/**@ignore*/ tokens.last = function() { return tokens[tokens.length-1]; }
/**@ignore*/ tokens.lastSym = function() {
if (this.read_word(stream, tokens)) continue;
// if execution reaches here then an error has happened
- tokens.push(new Token(stream.next(), "TOKN", "UNKNOWN_TOKEN"));
+ tokens.push(new Token(stream.next(), "TOKN", "UNKNOWN_TOKEN", this.line));
}
}
else {
var name;
- if ((name = Lang.keyword(found))) tokens.push(new Token(found, "KEYW", name));
- else tokens.push(new Token(found, "NAME", "NAME"));
+ if ((name = Lang.keyword(found))) {
+ tokens.push(new Token(found, "KEYW", name, this.line));
+ return true;
+ }
+ if (!this.sepIdents || found.indexOf('.') < 0 ) {
+ tokens.push(new Token(found, "NAME", "NAME", this.line));
+ return true;
+ }
+ var n = found.split('.');
+ var p = false;
+ n.forEach(function(nm) {
+ if (p) {
+ tokens.push(new Token('.', "PUNC", "DOT", this.line));
+ }
+ p=true;
+ tokens.push(new Token(nm, "NAME", "NAME", this.line));
+ });
return true;
+
}
},
return false;
}
else {
- tokens.push(new Token(found, "PUNC", Lang.punc(found)));
+ tokens.push(new Token(found, "PUNC", Lang.punc(found), this.line));
return true;
}
},
}
else {
if (this.collapseWhite) found = " ";
- if (this.keepWhite) tokens.push(new Token(found, "WHIT", "SPACE"));
+ if (this.keepWhite) tokens.push(new Token(found, "WHIT", "SPACE", this.line));
return true;
}
},
var found = "";
while (!stream.look().eof && Lang.isNewline(stream.look())) {
+ this.line++;
found += stream.next();
}
}
else {
if (this.collapseWhite) found = "\n";
- if (this.keepWhite) tokens.push(new Token(found, "WHIT", "NEWLINE"));
+ if (this.keepWhite) tokens.push(new Token(found, "WHIT", "NEWLINE", this.line));
return true;
}
},
read_mlcomment : function(/**JSDOC.TokenStream*/stream, tokens) {
if (stream.look() == "/" && stream.look(1) == "*") {
var found = stream.next(2);
-
+ var c = '';
while (!stream.look().eof && !(stream.look(-1) == "/" && stream.look(-2) == "*")) {
- found += stream.next();
+ c = stream.next();
+ if (c == "\n") this.line++;
+ found += c;
}
// to start doclet we allow /** or /*** but not /**/ or /****
- if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new Token(found, "COMM", "JSDOC"));
- else if (this.keepComments) tokens.push(new Token(found, "COMM", "MULTI_LINE_COMM"));
+ if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new Token(found, "COMM", "JSDOC", this.line));
+ else if (this.keepComments) tokens.push(new Token(found, "COMM", "MULTI_LINE_COMM", this.line));
return true;
}
return false;
}
if (this.keepComments) {
- tokens.push(new Token(found, "COMM", "SINGLE_LINE_COMM"));
+ tokens.push(new Token(found, "COMM", "SINGLE_LINE_COMM", this.line));
}
+ this.line++;
return true;
}
return false;
}
else if (stream.look() == "\"") {
string += stream.next();
- tokens.push(new Token(string, "STRN", "DOUBLE_QUOTE"));
+ tokens.push(new Token(string, "STRN", "DOUBLE_QUOTE", this.line));
return true;
}
else {
}
else if (stream.look() == "'") {
string += stream.next();
- tokens.push(new Token(string, "STRN", "SINGLE_QUOTE"));
+ tokens.push(new Token(string, "STRN", "SINGLE_QUOTE", this.line));
return true;
}
else {
return false;
}
else {
- if (/^0[0-7]/.test(found)) tokens.push(new Token(found, "NUMB", "OCTAL"));
- else tokens.push(new Token(found, "NUMB", "DECIMAL"));
+ if (/^0[0-7]/.test(found)) tokens.push(new Token(found, "NUMB", "OCTAL", this.line));
+ else tokens.push(new Token(found, "NUMB", "DECIMAL", this.line));
return true;
}
},
while (!stream.look().eof) {
if (Lang.isHexDec(found) && !Lang.isHexDec(found+stream.look())) { // done
- tokens.push(new Token(found, "NUMB", "HEX_DEC"));
+ tokens.push(new Token(found, "NUMB", "HEX_DEC", this.line));
return true;
}
else {
regex += stream.next();
}
- tokens.push(new Token(regex, "REGX", "REGX"));
+ tokens.push(new Token(regex, "REGX", "REGX", this.line));
return true;
}
else {