fix link
[lambda.git] / code / tokens.js
index 559c437..c6630fa 100644 (file)
@@ -12,8 +12,8 @@
 //      Comments of the ; type are ignored.
 
 //      Operators are by default single characters. Multicharacter
-//      operators can be made by supplying a string of prefix and
-//      suffix characters.
+//      operators can be made by supplying a string of multi_start and
+//      multi_continue characters.
 //      characters. For example,
 //           '<>+-&', '=>&:'
 //      will match any of these:
@@ -22,7 +22,7 @@
 /*jslint onevar: false
  */
 
-String.prototype.tokens = function (prefix, suffix) {
+String.prototype.tokens = function (multi_start, multi_continue) {
     var c;                      // The current character.
     var from;                   // The index of the start of the token.
     var i = 0;                  // The index of the current character.
@@ -51,13 +51,13 @@ String.prototype.tokens = function (prefix, suffix) {
         return;
     }
 
-// If prefix and suffix strings are not provided, supply defaults.
+// If multi_start and multi_continue strings are not provided, supply defaults.
 
-    if (typeof prefix !== 'string') {
-        prefix = '';
+    if (typeof multi_start !== 'string') {
+        multi_start = '';
     }
-    if (typeof suffix !== 'string') {
-        suffix = '';
+    if (typeof multi_continue !== 'string') {
+        multi_continue = '';
     }
 
 
@@ -81,10 +81,22 @@ String.prototype.tokens = function (prefix, suffix) {
             for (;;) {
                 c = this.charAt(i);
                 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
-                        (c >= '0' && c <= '9') || c === '_' || c === '-') {
+                        (c >= '0' && c <= '9') || c === '_' || c === '-' || c === '/') {
                     str += c;
                     i += 1;
-                } else {
+                               } else if (c === '?' || c === '!') {
+                               // should only be terminal
+                    str += c;
+                    i += 1;
+                                       c = this.charAt(i);
+                               // make sure next character is not an identifier
+                                       if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
+                                               (c >= '0' && c <= '9') || c === '_' || c === '-' || c === '/' || c === '?' || c === '!') {
+                                               str += c;
+                                               i += 1;
+                                               make('name', str).error("Bad identifier");
+                                       }
+                               } else {
                     break;
                 }
             }
@@ -141,12 +153,12 @@ String.prototype.tokens = function (prefix, suffix) {
 
 // multi-char operator.
 
-        } else if (prefix.indexOf(c) >= 0) {
+        } else if (multi_start.indexOf(c) >= 0) {
             str = c;
             i += 1;
             while (i < length) {
                 c = this.charAt(i);
-                if (suffix.indexOf(c) < 0) {
+                if (multi_continue.indexOf(c) < 0) {
                     break;
                 }
                 str += c;