Home | History | Annotate | Download | only in org
      1 /*
      2 Some portions:
      3 Copyright (c) 2008, Yahoo! Inc. All rights reserved.
      4 Code licensed under the BSD License:
      5 http://developer.yahoo.net/yui/license.txt
      6 version: 2.5.1
      7 */
      8 
      9 // create org.antlr module
     10 if (typeof org == "undefined" || !org) {
     11     var org = {};
     12 }
     13 if (typeof org.antlr == "undefined" || !org.antlr) {
     14     /**
     15      * The org.antlr global namespace object.  If antlr is already defined, the
     16      * existing antlr object will not be overwritten so that defined
     17      * namespaces are preserved.
     18      * @namespace org.antlr
     19      */
     20     org.antlr = {};
     21 }
     22 
     23 /**
     24  * The global JavaScript object.
     25  */
     26 org.antlr.global = (function() {
     27     return this;
     28 }).call(null);
     29 
     30 /**
     31  * Returns the namespace specified and creates it if it doesn't exist.
     32  *
     33  * Be careful when naming packages. Reserved words may work in some browsers
     34  * and not others. For instance, the following will fail in Safari:
     35  * <pre>
     36  * org.antlr.namespace("really.long.nested.namespace");
     37  * </pre>
     38  * This fails because "long" is a future reserved word in ECMAScript
     39  *
     40  * @static
     41  * @param  {Array.<String>} arguments 1-n namespaces to create
     42  * @return {Object}  A reference to the last namespace object created
     43  * @example
     44  * org.antlr.namespace("org.antlr.property.package");
     45  */
     46 org.antlr.namespace = function() {
     47     var a=arguments, o=null, i, j, d;
     48     for (i=0; i<a.length; i=i+1) {
     49         d=a[i].split(".");
     50         o=org.antlr.global;
     51 
     52         // ANTLR is implied, so it is ignored if it is included
     53         for (j=0; j<d.length; j=j+1) {
     54             o[d[j]]=o[d[j]] || {};
     55             o=o[d[j]];
     56         }
     57     }
     58 
     59     return o;
     60 };
     61 
     62 /**
     63  * org.antlr.env is used to keep track of what is known about the library and
     64  * the browsing environment
     65  * @namespace org.antlr.env
     66  */
     67 org.antlr.env = org.antlr.env || {};
     68 
     69 /**
     70  * Do not fork for a browser if it can be avoided.  Use feature detection when
     71  * you can.  Use the user agent as a last resort.  org.antlr.env.ua stores a
     72  * version number for the browser engine, 0 otherwise.  This value may or may
     73  * not map to the version number of the browser using the engine.  The value is
     74  * presented as a float so that it can easily be used for boolean evaluation
     75  * as well as for looking for a particular range of versions.  Because of this,
     76  * some of the granularity of the version info may be lost (e.g., Gecko 1.8.0.9
     77  * reports 1.8).
     78  * @namespace org.antlr.env.ua
     79  */
     80 org.antlr.env.ua = function() {
     81     var o= /** @lends org.antlr.env.ua */ {
     82 
     83         /**
     84          * Internet Explorer version number or 0.  Example: 6
     85          * @property ie
     86          * @type float
     87          */
     88         ie:0,
     89 
     90         /**
     91          * Opera version number or 0.  Example: 9.2
     92          * @property opera
     93          * @type float
     94          */
     95         opera:0,
     96 
     97         /**
     98          * Gecko engine revision number.  Will evaluate to 1 if Gecko
     99          * is detected but the revision could not be found. Other browsers
    100          * will be 0.  Example: 1.8
    101          * <pre>
    102          * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7
    103          * Firefox 1.5.0.9: 1.8.0.9 <-- Reports 1.8
    104          * Firefox 2.0.0.3: 1.8.1.3 <-- Reports 1.8
    105          * Firefox 3 alpha: 1.9a4   <-- Reports 1.9
    106          * </pre>
    107          * @property gecko
    108          * @type float
    109          */
    110         gecko:0,
    111 
    112         /**
    113          * AppleWebKit version.  KHTML browsers that are not WebKit browsers
    114          * will evaluate to 1, other browsers 0.  Example: 418.9.1
    115          * <pre>
    116          * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
    117          *                                   latest available for Mac OSX 10.3.
    118          * Safari 2.0.2:         416     <-- hasOwnProperty introduced
    119          * Safari 2.0.4:         418     <-- preventDefault fixed
    120          * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
    121          *                                   different versions of webkit
    122          * Safari 2.0.4 (419.3): 419     <-- Tiger installations that have been
    123          *                                   updated, but not updated
    124          *                                   to the latest patch.
    125          * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with native SVG
    126          *                                   and many major issues fixed).
    127          * 3.x yahoo.com, flickr:422     <-- Safari 3.x hacks the user agent
    128          *                                   string when hitting yahoo.com and
    129          *                                   flickr.com.
    130          * Safari 3.0.4 (523.12):523.12  <-- First Tiger release - automatic update
    131          *                                   from 2.x via the 10.4.11 OS patch
    132          * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded event.
    133          *                                   yahoo.com user agent hack removed.
    134          *
    135          * </pre>
    136          * http://developer.apple.com/internet/safari/uamatrix.html
    137          * @property webkit
    138          * @type float
    139          */
    140         webkit: 0,
    141 
    142         /**
    143          * The mobile property will be set to a string containing any relevant
    144          * user agent information when a modern mobile browser is detected.
    145          * Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
    146          * devices with the WebKit-based browser, and Opera Mini.
    147          * @property mobile
    148          * @type string
    149          */
    150         mobile: null,
    151 
    152         /**
    153          * Adobe AIR version number or 0.  Only populated if webkit is detected.
    154          * Example: 1.0
    155          * @property air
    156          * @type float
    157          */
    158         air: 0,
    159 
    160         /**
    161          * Is this the Rhino interpreter?
    162          * @property rhino
    163          * @type Boolean
    164          */
    165         rhino: false
    166 
    167     };
    168 
    169     var ua, m;
    170 
    171     try {
    172         ua = navigator.userAgent;
    173 
    174         // Modern KHTML browsers should qualify as Safari X-Grade
    175         if ((/KHTML/).test(ua)) {
    176             o.webkit=1;
    177         }
    178         // Modern WebKit browsers are at least X-Grade
    179         m=ua.match(/AppleWebKit\/([^\s]*)/);
    180         if (m&&m[1]) {
    181             o.webkit=parseFloat(m[1]);
    182 
    183             // Mobile browser check
    184             if (/ Mobile\//.test(ua)) {
    185                 o.mobile = "Apple"; // iPhone or iPod Touch
    186         } else {
    187             m=ua.match(/NokiaN[^\/]*/);
    188             if (m) {
    189                 o.mobile = m[0]; // Nokia N-series, ex: NokiaN95
    190             }
    191         }
    192 
    193         m=ua.match(/AdobeAIR\/([^\s]*)/);
    194         if (m) {
    195             o.air = m[0]; // Adobe AIR 1.0 or better
    196         }
    197 
    198         }
    199 
    200         if (!o.webkit) { // not webkit
    201             // @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
    202             m=ua.match(/Opera[\s\/]([^\s]*)/);
    203             if (m&&m[1]) {
    204                 o.opera=parseFloat(m[1]);
    205                 m=ua.match(/Opera Mini[^;]*/);
    206             if (m) {
    207                 o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
    208             }
    209             } else { // not opera or webkit
    210                 m=ua.match(/MSIE\s([^;]*)/);
    211                 if (m&&m[1]) {
    212                     o.ie=parseFloat(m[1]);
    213                 } else { // not opera, webkit, or ie
    214                     m=ua.match(/Gecko\/([^\s]*)/);
    215                     if (m) {
    216                         o.gecko=1; // Gecko detected, look for revision
    217                         m=ua.match(/rv:([^\s\)]*)/);
    218                         if (m&&m[1]) {
    219                             o.gecko=parseFloat(m[1]);
    220                         }
    221                     }
    222                 }
    223             }
    224         }
    225     } catch(e) {
    226         // ignore this if we're not in a browser
    227     }
    228 
    229     try {
    230         if (typeof window=="undefined" && typeof loadClass!="undefined") {
    231             o.rhino = true;
    232         }
    233     } catch(e) {}
    234 
    235 
    236     return o;
    237 }();
    238 
    239 /**
    240  * JavaScript runtime library code.
    241  * @name org.antlr.runtime
    242  * @namespace
    243  */
    244 /**
    245  * JavaScript runtime library tree parser code.
    246  * @name org.antlr.runtime.tree
    247  * @namespace
    248  */
    249 org.antlr.namespace("org.antlr.runtime.tree");
    250 
    251 /**
    252  * Provides the language utilites and extensions used by the library
    253  * @namespace org.antlr.lang
    254  */
    255 org.antlr.lang = org.antlr.lang || /** @lends org.antlr.lang */ {
    256     /**
    257      * Determines whether or not the provided object is an array.
    258      * Testing typeof/instanceof/constructor of arrays across frame
    259      * boundaries isn't possible in Safari unless you have a reference
    260      * to the other frame to test against its Array prototype.  To
    261      * handle this case, we test well-known array properties instead.
    262      * properties.
    263      * @param {any} o The object being testing
    264      * @return {boolean} the result
    265      */
    266     isArray: function(o) {
    267         if (o) {
    268            var l = org.antlr.lang;
    269            return l.isNumber(o.length) && l.isFunction(o.splice);
    270         }
    271         return false;
    272     },
    273 
    274     /**
    275      * Determines whether or not the provided object is a boolean
    276      * @param {any} o The object being testing
    277      * @return {boolean} the result
    278      */
    279     isBoolean: function(o) {
    280         return typeof o === 'boolean';
    281     },
    282 
    283     /**
    284      * Determines whether or not the provided object is a function
    285      * @param {any} o The object being testing
    286      * @return {boolean} the result
    287      */
    288     isFunction: function(o) {
    289         return typeof o === 'function';
    290     },
    291 
    292     /**
    293      * Determines whether or not the provided object is null
    294      * @param {any} o The object being testing
    295      * @return {boolean} the result
    296      */
    297     isNull: function(o) {
    298         return o === null;
    299     },
    300 
    301     /**
    302      * Determines whether or not the provided object is a legal number
    303      * @param {any} o The object being testing
    304      * @return {boolean} the result
    305      */
    306     isNumber: function(o) {
    307         return typeof o === 'number' && isFinite(o);
    308     },
    309 
    310     /**
    311      * Determines whether or not the provided object is of type object
    312      * or function
    313      * @param {any} o The object being testing
    314      * @return {boolean} the result
    315      */
    316     isObject: function(o) {
    317 return (o && (typeof o === 'object' || org.antlr.lang.isFunction(o))) || false;
    318     },
    319 
    320     /**
    321      * Determines whether or not the provided object is a string
    322      * @param {any} o The object being testing
    323      * @return {boolean} the result
    324      */
    325     isString: function(o) {
    326         return typeof o === 'string';
    327     },
    328 
    329     /**
    330      * Determines whether or not the provided object is undefined
    331      * @param {any} o The object being testing
    332      * @return {boolean} the result
    333      */
    334     isUndefined: function(o) {
    335         return typeof o === 'undefined';
    336     },
    337 
    338     /**
    339      * IE will not enumerate native functions in a derived object even if the
    340      * function was overridden.  This is a workaround for specific functions
    341      * we care about on the Object prototype.
    342      * @param {Function} r  the object to receive the augmentation
    343      * @param {Function} s  the object that supplies the properties to augment
    344      * @private
    345      */
    346     _IEEnumFix: function(r, s) {
    347         if (org.antlr.env.ua.ie) {
    348             var add=["toString", "valueOf"], i;
    349             for (i=0;i<add.length;i=i+1) {
    350                 var fname=add[i],f=s[fname];
    351                 if (org.antlr.lang.isFunction(f) && f!=Object.prototype[fname]) {
    352                     r[fname]=f;
    353                 }
    354             }
    355         }
    356     },
    357 
    358     /**
    359      * Utility to set up the prototype, constructor and superclass properties to
    360      * support an inheritance strategy that can chain constructors and methods.
    361      * Static members will not be inherited.
    362      *
    363      * @method extend
    364      * @static
    365      * @param {Function} subc   the object to modify
    366      * @param {Function} superc the object to inherit
    367      * @param {Object} [overrides]  additional properties/methods to add to the
    368      *                              subclass prototype.  These will override the
    369      *                              matching items obtained from the superclass
    370      *                              if present.
    371      */
    372     extend: function(subc, superc, overrides) {
    373         if (!superc||!subc) {
    374             throw new Error("org.antlr.lang.extend failed, please check that " +
    375                             "all dependencies are included.");
    376         }
    377         var F = function() {};
    378         F.prototype=superc.prototype;
    379         subc.prototype=new F();
    380         subc.prototype.constructor=subc;
    381         subc.superclass=superc.prototype;
    382         if (superc.prototype.constructor == Object.prototype.constructor) {
    383             superc.prototype.constructor=superc;
    384         }
    385 
    386         if (overrides) {
    387             for (var i in overrides) {
    388                 subc.prototype[i]=overrides[i];
    389             }
    390 
    391             org.antlr.lang._IEEnumFix(subc.prototype, overrides);
    392         }
    393     },
    394 
    395     /**
    396      * Applies all properties in the supplier to the receiver if the
    397      * receiver does not have these properties yet.  Optionally, one or
    398      * more methods/properties can be specified (as additional
    399      * parameters).  This option will overwrite the property if receiver
    400      * has it already.  If true is passed as the third parameter, all
    401      * properties will be applied and _will_ overwrite properties in
    402      * the receiver.
    403      *
    404      * @param {Function} r  the object to receive the augmentation
    405      * @param {Function} s  the object that supplies the properties to augment
    406      * @param {Array.<String>|boolean}  [arguments] zero or more properties
    407      *        methods  to augment the receiver with.  If none specified,
    408      *        everything in the supplier will be used unless it would
    409      *        overwrite an existing property in the receiver. If true
    410      *        is specified as the third parameter, all properties will
    411      *        be applied and will overwrite an existing property in
    412      *        the receiver
    413      */
    414     augmentObject: function(r, s) {
    415         if (!s||!r) {
    416             throw new Error("Absorb failed, verify dependencies.");
    417         }
    418         var a=arguments, i, p, override=a[2];
    419         if (override && override!==true) { // only absorb the specified properties
    420             for (i=2; i<a.length; i=i+1) {
    421                 r[a[i]] = s[a[i]];
    422             }
    423         } else { // take everything, overwriting only if the third parameter is true
    424             for (p in s) {
    425                 if (override || !r[p]) {
    426                     r[p] = s[p];
    427                 }
    428             }
    429 
    430             org.antlr.lang._IEEnumFix(r, s);
    431         }
    432     },
    433 
    434     /**
    435      * Same as org.antlr.lang.augmentObject, except it only applies prototype properties
    436      * @see org.antlr.lang.augmentObject
    437      * @param {Function} r  the object to receive the augmentation
    438      * @param {Function} s  the object that supplies the properties to augment
    439      * @param {Array.<String>|boolean}  [arguments] zero or more properties methods
    440      *        to augment the receiver with.  If none specified, everything
    441      *        in the supplier will be used unless it would overwrite an existing
    442      *        property in the receiver.  if true is specified as the third
    443      *        parameter, all properties will be applied and will overwrite an
    444      *        existing property in the receiver
    445      */
    446     augmentProto: function(r, s) {
    447         if (!s||!r) {
    448             throw new Error("Augment failed, verify dependencies.");
    449         }
    450         //var a=[].concat(arguments);
    451         var a=[r.prototype,s.prototype];
    452         for (var i=2;i<arguments.length;i=i+1) {
    453             a.push(arguments[i]);
    454         }
    455         org.antlr.lang.augmentObject.apply(this, a);
    456     },
    457 
    458     /**
    459      * Returns a new object containing all of the properties of
    460      * all the supplied objects.  The properties from later objects
    461      * will overwrite those in earlier objects.
    462      * @param arguments {Object*} the objects to merge
    463      * @return the new merged object
    464      */
    465     merge: function() {
    466         var o={}, a=arguments;
    467         for (var i=0, l=a.length; i<l; i=i+1) {
    468             org.antlr.lang.augmentObject(o, a[i], true);
    469         }
    470         return o;
    471     },
    472 
    473     /**
    474      * A convenience method for detecting a legitimate non-null value.
    475      * Returns false for null/undefined/NaN, true for other values,
    476      * including 0/false/''
    477      * @param o {any} the item to test
    478      * @return {boolean} true if it is not null/undefined/NaN || false
    479      */
    480     isValue: function(o) {
    481         var l = org.antlr.lang;
    482 return (l.isObject(o) || l.isString(o) || l.isNumber(o) || l.isBoolean(o));
    483     },
    484 
    485     /** @namespace org.antlr.lang.array Array convenience methods. */
    486     array: /** @lends org.antlr.lang.array */ {
    487         /**
    488          * Retrieve the last element of an array. Throws an error if a is not
    489          * an array or empty.
    490          * @param a {Array} the array stack to peek in
    491          * @return the last element of the array
    492          */
    493          peek: function(a) {
    494             if (!org.antlr.lang.isArray(a)) {
    495                 throw new Error("org.antlr.lang.array.peek: a is not an array.");
    496             }
    497             var l = a.length;
    498             if (l<=0) {
    499                 throw new Error("org.antlr.lang.array.peek: a is empty.");
    500             }
    501             return a[l-1];
    502         }
    503     }
    504 };
    505