Changeset 35664

Show
Ignore:
Timestamp:
10/21/09 20:34:30 (4 years ago)
Author:
hoge1e3
Message:
 
Location:
lang/haxe/Tonyu2
Files:
3 modified

Legend:

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

    r35663 r35664  
    66        public function new(mesg:String){this.message=mesg;} 
    77} 
    8 typedef ParserSub = Void->Dynamic; 
     8typedef ParserSub = Parser->Dynamic; 
    99//public delegate object ParserSub(); 
    1010//public delegate void VoidSub(); 
    1111class Parser { 
    1212        var input:String; 
    13         var context; 
     13        var context:Dynamic; 
    1414        var p:Int; 
    1515        var maxErrorPos:Int; 
     
    2121        public var rest(getRest,null):String; 
    2222        function getRest():String { 
    23                 return input.Substring(p); 
     23                return input.substr(p); 
    2424        } 
    2525        public function  proceed(by:Int):Int {return p+=by;} 
    26         public var eos(isEOS,null):Boolean; 
    27         function isEOS():Boolean { 
    28            return p>=rest.Length; 
     26        public var eos(isEOS,null):Bool; 
     27        function isEOS():Bool { 
     28           return p>=rest.length; 
    2929        } 
    3030        var lastError:String; 
     
    6161                  var message:String=match+" expected"; 
    6262                  var m:String=match; 
    63                   return function() { 
    64                         if (startsWith(rest,m)) { 
    65                                 proceed(m.length); 
     63                  return function(t:Parser) { 
     64                        if (startsWith(t.rest,m)) { 
     65                                t.proceed(m.length); 
    6666                                return m; 
    6767                        } 
    68                         raise(message); 
     68                        t.raise(message); 
    6969                        return null; 
    7070                  }; 
    7171           } else if (Std.is(match , EReg)) { 
    72                   var message=match+" expected"; 
     72                  var message=Std.string(match)+" expected"; 
    7373                  var r:EReg=match; 
    74                   return function() { 
    75                         skipSpace(); 
    76                         if (r.match(rest)) { 
    77                                 if (r.matchedPos.pos()>0) throw new Exception("Invalid regex; it must start with ^ :"+r); 
    78                                 proceed(r.matched(0).length); 
     74                  return function(t:Parser) { 
     75                        t.skipSpace(); 
     76                        if (r.match(t.rest)) { 
     77                                if (r.matchedPos().pos>0) throw ("Invalid regex; it must start with ^ :"+r); 
     78                                t.proceed(r.matched(0).length); 
    7979                                return r.matched(0); 
    8080                        } 
    81                         raise(message); 
     81                        t.raise(message); 
    8282                        return null; 
    8383                  }; 
     
    101101        public function cache(name:String, sub:ParserSub ) { 
    102102           trace("Parsing "+name); 
    103            return sub(); 
     103           return sub(this); 
    104104        } 
    105105                        //# combinator 
    106106        public function seq(seq:Array<Dynamic>):ParserSub { 
    107107                var cls= toClosures(seq); 
    108                 return function() { 
     108                return function(t:Parser) { 
    109109                   var res=[]; 
    110                    for (var r in cls) { 
    111                                 res.push(r()); 
     110                   var r:ParserSub; 
     111                   for (r in cls) { 
     112                                res.push(r(t)); 
    112113                   } 
    113114                   return res; 
     
    115116        } 
    116117        public function parseSeq(s:Array<Dynamic>):Array<Dynamic> { 
    117                 return seq(s)(); 
    118         } 
    119         public function tryThese(_:Array<Dynamic>) {                     
     118                return seq(s)(this); 
     119        } 
     120        public function tryThese(_:Array<Dynamic>):ParserSub {                   
    120121                var subs=toClosures(_);  
    121                 return function () { 
     122                return function (t:Parser) { 
    122123                   var res=null; 
    123                    //#my $trID=rand(10000); 
    124                    var trID=100; 
     124                   var trID=Std.random(10000); 
    125125                   trace("Trying "+trID); 
    126126                   var lastError:ParseError =null; 
    127                    for (var sub in subs) { 
    128                           var st=saveState(); 
     127                   var sub:ParserSub; 
     128                   for (sub in subs) { 
     129                          var st=t.saveState(); 
    129130                          lastError=null; 
    130131                          try { 
    131                                  res=sub(); 
     132                                 res=sub(t); 
    132133                          } catch (p:ParseError) { 
    133134                                lastError=p; 
    134                                 restoreState(st); 
     135                                t.restoreState(st); 
    135136                          } 
    136137                          if (lastError==null) {trace("Trial "+trID+" OK res="+res); return res;} 
     
    149150        } 
    150151        public function maybe(_:Array<Dynamic>):ParserSub { 
    151            return function () { 
    152                  var res: Array<Dynamic> = reptN(0,1,seqAry(_))(); 
     152           return function (t:Parser) { 
     153                 var res: Array<Dynamic> = (t.reptN(0,1,t.seq(_)))(t); 
    153154                 if (res.length==1) return res[0]; 
    154155                 return null; 
     
    156157        } 
    157158 
    158         public function reptN(min:int , max:int, sub:ParserSub):ParserSub  { 
    159            return function() { 
     159        public function reptN(min:Int , max:Int, sub:ParserSub):ParserSub  { 
     160           return function(t:Parser) { 
    160161                 var res=[]; 
    161                  while (res.Count<max) { 
     162                 while (res.length<max) { 
    162163                        var suc=true; 
    163                         var fail=function(){suc=false;return null;}; 
    164                         var tres=tryThese(sub, fail)(); 
     164                        var fail=function(t:Parser){suc=false;return null;}; 
     165                        var tres=(t.tryThese([sub, fail]))(t); 
    165166                        if (suc) { 
    166167                                res.push(tres); 
     
    169170                        } 
    170171                 } 
    171                  if (res.length<min) {raise("only "+res.Count+" time for ("+min+" - "+max+")");} 
    172                  trace("repeated "+res.Count+"("+min+" - "+max+")  OK, proceed"); 
     172                 if (res.length<min) { 
     173                        t.raise("only "+res.length+" time for ("+min+" - "+max+")"); 
     174                } 
     175                 trace("repeated "+res.length+"("+min+" - "+max+")  OK, proceed"); 
    173176                 //#if ($cnt!=@res) {die("Why $cnt ".scalar(@res));} 
    174177                 return res; 
  • lang/haxe/Tonyu2/Test.hx

    r35663 r35664  
    11 
    2 class TestParser:Parser { 
    3         var alpha=~/^[a-z]+/; 
    4         public TestParser(string src):base(src) {} 
    5         public void parse() { 
    6                 var res=parseSeq(alpha,alpha); 
    7                 foreach (var r in res) { 
    8                         System.Console.Write("found :"+r+"\n"); 
     2class TestParser extends Parser { 
     3        static var alpha=~/^[a-z]+/; 
     4        public function new(src:String) {super(src);} 
     5        public function parse() { 
     6                var res=parseSeq([alpha,alpha]); 
     7                var r; 
     8                for (r in res) { 
     9                        trace("found :"+r); 
    910                } 
    1011        } 
    1112} 
    1213class Test { 
    13         public static void Main() { 
    14                 new TestParser("  aho baka ").parse(); 
     14        static function main() { 
     15                new TestParser(" (1+2)*3 ").parse(); 
    1516                //System.Console.Write("Test"); 
    1617        } 
  • lang/haxe/Tonyu2/make.hxml

    r35663 r35664  
    1010-neko scratch.n 
    1111-main Scratch.hx 
     12 
     13--next 
     14-neko parser.n 
     15-main Test.hx