Changeset 28557

Show
Ignore:
Timestamp:
01/17/09 20:52:36 (4 years ago)
Author:
hoge1e3
Message:

Upgrade parser functions
(under construction)

Location:
lang/javascript/nohada/js/parser
Files:
1 added
2 modified

Legend:

Unmodified
Added
Removed
  • lang/javascript/nohada/js/parser/Parser.js

    r28524 r28557  
    55   }, 
    66   parse: function (grammar) { 
    7            grammar.parse(this); 
     7                /*if (grammar instanceof Grammar) { 
     8                        return grammar.parse(this); 
     9                }*/ 
     10                if (grammar instanceof Function) { 
     11                        return grammar(this); 
     12                } 
     13                throw "Not parseable : "+grammar; 
    814   }, 
    915   getTrailString: function () {   
     
    1824   match: function (str) { 
    1925                var t=this.getTrailString(); 
    20                 if (str instanceof Grammar) { 
    21                         return str.parse(this); 
     26                if (str instanceof Function) { 
     27                        return str.apply(this.curObj,[this]); 
    2228                } 
    2329            if (typeof(str)=="string") { 
     
    2632                                return str; 
    2733                        } 
    28                         this.parseError("String '"+str+"' Expected" ); 
     34                        this.parseError("String '"+str+"' Expected at "+t ); 
    2935                } 
    3036                if (str instanceof RegExp) { 
     
    3743                                return res; 
    3844                        } 
    39                         this.parseError("Regex '"+str+"' Expected" ); 
     45                        this.parseError("Regex '"+str+"' Expected at "+t ); 
    4046                } 
    4147                this.parseError("Invalid element "+str); 
     
    4551   } 
    4652}); 
    47 Grammar=Class.create({ 
    48    initialize: function (elems) { 
    49            this.elems=elems.map(function (e,i) { 
    50                         if (e instanceof Function) { 
    51                                 return function (p) { 
    52                                    return e.apply(p.curObj,[p]); 
    53                                 }; 
     53function gram() { 
     54        var elems=$A(arguments); 
     55        /*elems=elems.map(function (e) { 
     56                if (e instanceof Array) { 
     57                        var rept=e.pop(); 
     58                        var g=gram.apply(this,e); 
     59                        e.push(rept); 
     60                        if (rept=="*") { 
     61                                return gramRepeat(g,0); 
    5462                        } 
    55                 return function (p) { 
    56                             return p.match(e); 
    57                         }; 
    58            }); 
    59    }, 
    60    parse: function (parser) { 
     63                        if (rept=="+") { 
     64                                return gramRepeat(g,1); 
     65                        } 
     66                        return gramMaybe(g); 
     67                } 
     68                return e; 
     69        });*/ 
     70        var _this; 
     71        _this=function (parser) { 
    6172           if (typeof(parser)=="string") { 
    6273                        var p=new Parser(parser); 
    63                         return this.parse(p); 
     74                        return p.parse(_this); 
    6475           } 
    6576           var sv=parser.saveState(); 
    6677           try { 
    6778                   var svCur=parser.curObj; 
    68                    parser.curObj={}; 
    69                    var res; 
    70                    for (var i=0 ; i<this.elems.length ; i++) { 
    71                            var e=this.elems[i]; 
    72                            res=e(parser);    
    73                            parser.curObj[i]=res; 
    74                    } 
    75                    //alert (" ARY "+Object.toJSON(parser.curObj)); 
    76                    parser.length=this.elems.length; 
     79                   var res=[]; 
     80                   parser.curObj=res; 
     81                   elems.each(function (e) { 
     82                           res.push(parser.match(e));    
     83                   }); 
    7784                   parser.curObj=svCur; 
     85                   //alert("P "+Object.toJSON(res)); 
    7886                   return res; 
    7987           } catch(e) { 
     
    8189                   throw e; 
    8290           } 
    83    } 
    84     
    85 }); 
    86 function gram() { 
    87   var elems=$A(arguments); 
    88   return new Grammar(elems); 
     91    }; 
     92        return _this; 
    8993} 
     94function gramRepeat(grm,min) { 
     95        return function (p) { 
     96                var sv; 
     97                var res=[]; 
     98            try { 
     99                        while (true) { 
     100                                sv=parser.saveState(); 
     101                                res.push(grm(p)); 
     102                        } 
     103            } catch(e) { 
     104                        parser.restoreState(sv); 
     105                    if (res.length>=min) return res; 
     106                        throw e; 
     107            } 
     108        } 
     109} 
     110 
     111 
     112 
  • lang/javascript/nohada/js/parser/ParserTest.js

    r28524 r28557  
    55        var res=tag("span","X"); 
    66        TagBuilder.write([text,res]); 
    7         var num=gram(/[0-9]+/,function (p) { 
    8             //alert(Object.toJSON(this));        
    9         var s=this; 
     7        function num(p) { 
     8            var s=p.parse(gram(/[0-9]+/)); 
    109                return parseInt(s[0]); 
    11         }); 
    12         var g=gram(num,/[\+\-]/,num,function (p) { 
    13             //alert(Object.toJSON(this));        
    14  
    15             var s=this; 
    16                 var op=s[1]; 
     10        } 
     11        function g(p) { 
     12            var s=p.parse( gram(num,gramRepeat(grm(/[\+\-]/,num),0))); 
     13                //alert(Object.toJSON(s)); 
     14                var head=s[0]; 
     15                var tail=s[1]; 
     16                tail.each 
    1717                if (op=="+") return s[0]+s[2]; 
    1818                if (op=="-") return s[0]-s[2]; 
    19         });      
     19        }                
    2020        function calc() { 
    21                 res.set( g.parse(text.get()) ); 
     21                res.set( new Parser(text.get()).parse(g) ); 
    2222        } 
    2323  }