Changeset 35690

Show
Ignore:
Timestamp:
10/23/09 13:32:55 (4 years ago)
Author:
hoge1e3
Message:
 
Location:
lang/haxe/Tonyu2
Files:
5 added
1 removed
5 modified

Legend:

Unmodified
Added
Removed
  • lang/haxe/Tonyu2/Parser.hx

    r35669 r35690  
    66        public function new(mesg:String){this.message=mesg;} 
    77} 
    8 typedef ParserSub = Parser->Dynamic; 
    9 //public delegate object ParserSub(); 
     8typedef Combinator = Void->Dynamic; 
     9//public delegate object Combinator(); 
    1010//public delegate void VoidSub(); 
    1111class Parser { 
     
    5555        } 
    5656        public function parse(m:Dynamic):Dynamic { 
    57                 return toClosure(m)(this); 
    58         } 
    59         public function toClosure(match:Dynamic):ParserSub { 
     57                return combinator(m)(); 
     58        } 
     59 
     60        public function combinator(match:Dynamic):Combinator { 
    6061           if (Reflect.isFunction(match) ) { 
    61                    //var p:ParserSub=match; 
     62                   //var p:Combinator=match; 
    6263                   return match; 
    6364           } else if (Std.is(match ,String)) { 
    64                   var message:String=match+" expected"; 
    6565                  var m:String=match; 
    66                   return function(t:Parser) { 
    67                         if (startsWith(t.rest,m)) { 
    68                                 t.proceed(m.length); 
    69                                 return m; 
    70                         } 
    71                         t.raise(message); 
    72                         return null; 
    73                   }; 
     66                  return str(m); 
    7467           } else if (Std.is(match , EReg)) { 
    75                   var message=Std.string(match)+" expected"; 
    7668                  var r:EReg=match; 
    77                   return function(t:Parser) { 
     69                  return reg(r); 
     70           } else if (Std.is(match,Array)) { 
     71              var ary:Array<Dynamic>=match; 
     72              return seq(ary); 
     73           } 
     74           throw ("Invalid match: "+match); 
     75        } 
     76        public function skipSpace() { 
     77                if (space.match(rest)) { 
     78                        proceed(space.matchedPos().len); 
     79                } 
     80        } 
     81 
     82        public function combinators(seq:Array<Dynamic> ):Array<Combinator> { 
     83           var res:Array<Combinator>=[]; 
     84           var s; 
     85           for (s in seq) { 
     86                  res.push(combinator(s)); 
     87           } 
     88           return res; 
     89        }  
     90        public function cache(name:String, sub:Combinator ) { 
     91           trace("Parsing "+name); 
     92           return sub(); 
     93        } 
     94        public function parseSeq(s:Array<Dynamic>):Array<Dynamic> { 
     95                return seq(s)(); 
     96        }                        
     97        //# combinator 
     98        public function reg(r:EReg) { 
     99                var t=this; 
     100                var message=Std.string(r)+" expected"; 
     101                return function() { 
    78102                        t.skipSpace(); 
    79103                        if (r.match(t.rest)) { 
     
    84108                        t.raise(message); 
    85109                        return null; 
    86                   }; 
    87            } 
    88            throw ("Invalid match: "+match); 
    89         } 
    90         public function skipSpace() { 
    91                 if (space.match(rest)) { 
    92                         proceed(space.matchedPos().len); 
     110                }; 
     111        } 
     112        public function str(m:String) { 
     113                var t=this; 
     114                var message:String=m+" expected"; 
     115                return function () { 
     116                        if (startsWith(t.rest,m)) { 
     117                                t.proceed(m.length); 
     118                                return m; 
     119                        } 
     120                        t.raise(message); 
     121                        return null; 
    93122                } 
    94123        } 
    95  
    96         public function toClosures(seq:Array<Dynamic> ):Array<ParserSub> { 
    97            var res:Array<ParserSub>=[]; 
    98            var s; 
    99            for (s in seq) { 
    100                   res.push(toClosure(s)); 
    101            } 
    102            return res; 
    103         }  
    104         public function cache(name:String, sub:ParserSub ) { 
    105            trace("Parsing "+name); 
    106            return sub(this); 
    107         } 
    108                         //# combinator 
    109         public function seq(seq:Array<Dynamic>):ParserSub { 
    110                 var cls= toClosures(seq); 
    111                 return function(t:Parser) { 
     124        public function seq(seq:Array<Dynamic>):Combinator { 
     125                var cls= combinators(seq); 
     126                var t:Parser=this; 
     127                return function() { 
    112128                   var res=[]; 
    113                    var r:ParserSub; 
     129                   var r:Combinator; 
    114130                   for (r in cls) { 
    115                                 res.push(r(t)); 
     131                                res.push(r()); 
    116132                   } 
    117133                   return res; 
    118134                }; 
    119135        } 
    120         public function parseSeq(s:Array<Dynamic>):Array<Dynamic> { 
    121                 return seq(s)(this); 
    122         } 
    123         public function tryThese(_:Array<Dynamic>):ParserSub {                   
    124                 var subs=toClosures(_);  
    125                 return function (t:Parser) { 
    126                    var res=null; 
     136 
     137        public function either(_:Array<Dynamic>):Combinator {                    
     138                var subs=combinators(_);  
     139                var t:Parser=this; 
     140                return function() { 
     141                        var res=null; 
    127142                   var trID=Std.random(10000); 
    128143                   trace("Trying "+trID); 
    129144                   var lastError:ParseError =null; 
    130                    var sub:ParserSub; 
     145                   var sub:Combinator; 
    131146                   for (sub in subs) { 
    132147                          var st=t.saveState(); 
    133148                          lastError=null; 
    134149                          try { 
    135                                  res=sub(t); 
     150                                 res=sub(); 
    136151                          } catch (p:ParseError) { 
    137152                                lastError=p; 
     
    145160 
    146161         
    147         public function rept0(_:Array<Dynamic>):ParserSub  { 
    148            return reptN(0,1000,seq(_)); 
    149         } 
    150  
    151         public function rept1(_:Array<Dynamic>):ParserSub  { 
    152            return reptN(1,1000,seq(_)); 
    153         } 
    154         public function maybe(_:Array<Dynamic>):ParserSub { 
    155            return function (t:Parser) { 
    156                  var res: Array<Dynamic> = (t.reptN(0,1,t.seq(_)))(t); 
     162        public function rept0(_:Dynamic):Combinator  { 
     163           return reptN(0,1000,combinator(_)); 
     164        } 
     165 
     166        public function rept1(_:Dynamic):Combinator  { 
     167           return reptN(1,1000,combinator(_)); 
     168        } 
     169        public function maybe(_:Dynamic):Combinator { 
     170            var t:Parser=this; 
     171                return function() { 
     172                 var res: Array<Dynamic> = (t.reptN(0,1,t.combinator(_)))(); 
    157173                 if (res.length==1) return res[0]; 
    158174                 return null; 
     
    160176        } 
    161177 
    162         public function reptN(min:Int , max:Int, sub:ParserSub):ParserSub  { 
    163            return function(t:Parser) { 
     178        public function reptN(min:Int , max:Int, sub:Combinator):Combinator  { 
     179           var t:Parser=this; 
     180                return function() { 
    164181                 var res=[]; 
    165182                 while (res.length<max) { 
    166183                        var suc=true; 
    167                         var fail=function(t:Parser){suc=false;return null;}; 
    168                         var tres=(t.tryThese([sub, fail]))(t); 
     184                        var fail=function(){suc=false;return null;}; 
     185                        var tres=(t.either([sub, fail]))(); 
    169186                        if (suc) { 
    170187                                res.push(tres); 
  • lang/haxe/Tonyu2/Scratch.hx

    r35663 r35690  
    44*/ 
    55typedef IntF=Int->Int; 
    6 class Scratch { 
     6class Scratch extends Parser { 
     7   var x:Int; 
     8   function test(a:Int):Int{return a*2+x;} 
    79        static function startsWith(s:String,head:String):Bool { 
    810            return s.substr(0,head.length)==head; 
    911        } 
    10    static function main() { 
     12        function new(str:String){super(str);x=3;} 
     13    static function main() { 
     14        new Scratch(" yokan milk? cocoa  ").parse2(); 
     15        } 
     16    function parse2() {  grm.Test.wai(); 
     17                trace ( parse(rept0([~/^[a-z]+/ ,maybe("?")  ]))  ); 
     18                trace(this); 
     19        } 
     20        public function toString():String { 
     21           return "SCR"; 
     22        } 
     23        function gomi() { 
    1124       var a:Array<Dynamic>=[10,function(x:Int){return x*2;},2]; 
    1225           a.push(function (t:String) { 
     
    2841           var p=new Parser("abc"); 
    2942            
    30             
    3143           /* 
    3244           var f:IntF=function (a:Int){return a*2;}; 
  • lang/haxe/Tonyu2/Test.hx

    r35669 r35690  
    1818class Test { 
    1919    static function nop(c:Context){} 
    20     static function pass1(g:Gen) {return funciton(c:Context){g.pass1(c);}} 
     20    static function pass1(g:Gen) {return function(c:Context){g.pass1(c);}} 
    2121    static function elem(t:Parser) { 
    22            return parse(t.tryThese(const,_var)); 
     22           return t.parse(t.either([const,_var])); 
    2323        } 
    2424        static function const(t:Parser) { 
     
    4444                           c.out(x[0]); 
    4545                           x[1].gen(c); 
    46                            res=res+cast(x[1],Int); 
     46                           //res=res+cast(x[1],Int); 
    4747                        } 
    4848                  }