//<script type="text/javascript">
-XObject = imports.XObject.XObject;
-console = imports.console.console;
+const XObject = imports.XObject.XObject;
+const console = imports.console.console;
-Token = imports.Token.Token;
-Lang = imports.Lang.Lang;
+const Token = imports.Token.Token;
+const Lang = imports.Lang.Lang;
/**
@class Search a {@link JSDOC.TextStream} for language tokens.
*/
-TokenReader = XObject.define(
+const TokenReader = XObject.define(
function(o) {
XObject.extend(this, o || {});
sepIdents : false,
/** @cfg {String} filename name of file being parsed. **/
filename : '',
-
+ /** @config {Boolean} ignoreBadGrammer do not throw errors if we find stuff that might break compression **/
+ ignoreBadGrammer : false,
/**
* tokenize a stream
* @return {Array} of tokens
* tr.tokenize(ts)
*
*/
-
-
-
tokenize : function(/**JSDOC.TextStream*/stream) {
this.line =1;
var tokens = [];
for (var i = tokens.length-1; i >= 0; i--) {
if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i];
}
+ return true;
}
while (!stream.look().eof) {
return tokens;
},
+ /**
+ * findPuncToken - find the id of a token (previous to current)
+ * need to back check syntax..
+ *
+ * @arg {Array} tokens the array of tokens.
+ * @arg {String} token data (eg. '(')
+ * @arg {Number} offset where to start reading from
+ * @return {Number} position of token
+ */
+ findPuncToken : function(tokens, data, n) {
+ n = n || tokens.length -1;
+ var stack = 0;
+ while (n > -1) {
+
+ if (!stack && tokens[n].data == data) {
+ return n;
+ }
+
+ if (tokens[n].data == ')' || tokens[n].data == '}') {
+ stack++;
+ n--;
+ continue;
+ }
+ if (stack && (tokens[n].data == '{' || tokens[n].data == '(')) {
+ stack--;
+ n--;
+ continue;
+ }
+
+
+ n--;
+ }
+ return -1;
+ },
+ /**
+ * lastSym - find the last token symbol
+ * need to back check syntax..
+ *
+ * @arg {Array} tokens the array of tokens.
+ * @arg {Number} offset where to start..
+ * @return {Token} the token
+ */
+ lastSym : function(tokens, n) {
+ for (var i = n-1; i >= 0; i--) {
+ if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i];
+ }
+ return null;
+ },
+
+
+
/**
@returns {Boolean} Was the token found?
*/
var name;
if ((name = Lang.keyword(found))) {
if (found == 'return' && tokens.lastSym().data == ')') {
- throw {
- name : "ArgumentError",
- message: "\n" + this.filename + ':' + this.line + " Error - return found after )"
- }
-
+ //Seed.print('@' + tokens.length);
+ var n = this.findPuncToken(tokens, ')');
+ //Seed.print(')@' + n);
+ n = this.findPuncToken(tokens, '(', n-1);
+ //Seed.print('(@' + n);
+
+ var lt = this.lastSym(tokens, n);
+ print(JSON.stringify(lt));
+ if (lt.type != 'KEYW' || ['IF', 'WHILE'].indexOf(lt.name) < -1) {
+ if (!this.ignoreBadGrammer) {
+ throw {
+ name : "ArgumentError",
+ message: "\n" + this.filename + ':' + this.line + " Error - return found after )"
+ }
+ }
+ }
+
+
+
+ }
tokens.push(new Token(found, "KEYW", name, this.line));
return true;
if ((found == '}' || found == ']') && tokens.lastSym().data == ',') {
//print("Error - comma found before " + found);
//print(JSON.stringify(tokens.lastSym(), null,4));
- throw {
- name : "ArgumentError",
- message: "\n" + this.filename + ':' + this.line + " Error - comma found before " + found
- }
+ if (this.ignoreBadGrammer) {
+ print("\n" + this.filename + ':' + this.line + " Error - comma found before " + found);
+ } else {
+
+ throw {
+ name : "ArgumentError",
+ message: "\n" + this.filename + ':' + this.line + " Error - comma found before " + found
+ }
+ }
}
tokens.push(new Token(found, "PUNC", Lang.punc(found), this.line));
if (this.collapseWhite) {
found = "\n";
}
- if (this.keepWhite) {
- var last = tokens.pop();
+ if (this.keepWhite) {
+ var last = tokens ? tokens.pop() : false;
if (last && last.name != "WHIT") {
tokens.push(last);
}