Changeset 35669

Show
Ignore:
Timestamp:
10/21/09 22:08:26 (4 years ago)
Author:
hoge1e3
Message:
 
Location:
lang/haxe/Tonyu2
Files:
2 modified

Legend:

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

    r35664 r35669  
    5353        static function startsWith(s:String,head:String):Bool { 
    5454            return s.substr(0,head.length)==head; 
     55        } 
     56        public function parse(m:Dynamic):Dynamic { 
     57                return toClosure(m)(this); 
    5558        } 
    5659        public function toClosure(match:Dynamic):ParserSub { 
  • lang/haxe/Tonyu2/Test.hx

    r35664 r35669  
    11 
    2 class 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); 
    10                 } 
     2class Context { 
     3    var vars:Hash<String>; 
     4        public function new() { 
     5           vars=new Hash<String>(); 
     6           buf=new Array<String>(); 
     7        } 
     8        public function checkVar(s:String) { 
     9           vars.set(s,"Dynamic"); 
     10        } 
     11        var buf:Array<String>; 
     12        public function out(s:String) { 
     13           buf.push(s); 
    1114        } 
    1215} 
     16typedef Ar=Array<Dynamic>; 
     17typedef Gen={pass1:Context->Void, gen:Context->Void}; 
    1318class Test { 
     19    static function nop(c:Context){} 
     20    static function pass1(g:Gen) {return funciton(c:Context){g.pass1(c);}} 
     21    static function elem(t:Parser) { 
     22           return parse(t.tryThese(const,_var)); 
     23        } 
     24        static function const(t:Parser) { 
     25                var r=t.parse(~/^[0-9]+/); 
     26                return {pass1:nop, gen:function (c){c.out(r);}}; 
     27        } 
     28        static function _var(t:Parser) { 
     29            var r:String=t.parse(~/^[a-z]+/); 
     30                return { 
     31                  pass1:function (c) {c.checkVar(r);}, 
     32                  gen:function (c) {c.out(r);} 
     33                }; 
     34        } 
     35        static function expr (t:Parser) { 
     36                var r=t.parseSeq([elem, t.rept0([~/\+\-/,elem]) ]); 
     37                var res:Gen=r[0]; 
     38                var p:Ar   =r[1]; 
     39                return { 
     40                  pass1:pass1(res), 
     41                  gen:function (c) { 
     42                        var x:Ar; 
     43                        for (x in p) { 
     44                           c.out(x[0]); 
     45                           x[1].gen(c); 
     46                           res=res+cast(x[1],Int); 
     47                        } 
     48                  } 
     49                }; 
     50        } 
    1451        static function main() { 
    15                 new TestParser(" (1+2)*3 ").parse(); 
     52                 
     53                trace( new Parser(" x=5;  y=x+20;").parse(expr) ); 
    1654                //System.Console.Write("Test"); 
    1755        }