Changeset 35690
- Timestamp:
- 10/23/09 13:32:55 (4 years ago)
- Location:
- lang/haxe/Tonyu2
- Files:
-
- 5 added
- 1 removed
- 5 modified
-
Parser.hx (modified) (5 diffs)
-
Scratch.hx (modified) (2 diffs)
-
Test.hx (modified) (2 diffs)
-
grm/Program.hx (deleted)
-
grm/Statement.hx (added)
-
grm/TClass.hx (added)
-
grm/TParser.hx (added)
-
grm/TypeReference.hx (added)
-
make.bat (added)
-
parser.n (modified) (previous)
-
scratch.n (modified) (previous)
Legend:
- Unmodified
- Added
- Removed
-
lang/haxe/Tonyu2/Parser.hx
r35669 r35690 6 6 public function new(mesg:String){this.message=mesg;} 7 7 } 8 typedef ParserSub = Parser->Dynamic;9 //public delegate object ParserSub();8 typedef Combinator = Void->Dynamic; 9 //public delegate object Combinator(); 10 10 //public delegate void VoidSub(); 11 11 class Parser { … … 55 55 } 56 56 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 { 60 61 if (Reflect.isFunction(match) ) { 61 //var p: ParserSub=match;62 //var p:Combinator=match; 62 63 return match; 63 64 } else if (Std.is(match ,String)) { 64 var message:String=match+" expected";65 65 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); 74 67 } else if (Std.is(match , EReg)) { 75 var message=Std.string(match)+" expected";76 68 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() { 78 102 t.skipSpace(); 79 103 if (r.match(t.rest)) { … … 84 108 t.raise(message); 85 109 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; 93 122 } 94 123 } 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() { 112 128 var res=[]; 113 var r: ParserSub;129 var r:Combinator; 114 130 for (r in cls) { 115 res.push(r( t));131 res.push(r()); 116 132 } 117 133 return res; 118 134 }; 119 135 } 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; 127 142 var trID=Std.random(10000); 128 143 trace("Trying "+trID); 129 144 var lastError:ParseError =null; 130 var sub: ParserSub;145 var sub:Combinator; 131 146 for (sub in subs) { 132 147 var st=t.saveState(); 133 148 lastError=null; 134 149 try { 135 res=sub( t);150 res=sub(); 136 151 } catch (p:ParseError) { 137 152 lastError=p; … … 145 160 146 161 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(_)))(); 157 173 if (res.length==1) return res[0]; 158 174 return null; … … 160 176 } 161 177 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() { 164 181 var res=[]; 165 182 while (res.length<max) { 166 183 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]))(); 169 186 if (suc) { 170 187 res.push(tres); -
lang/haxe/Tonyu2/Scratch.hx
r35663 r35690 4 4 */ 5 5 typedef IntF=Int->Int; 6 class Scratch { 6 class Scratch extends Parser { 7 var x:Int; 8 function test(a:Int):Int{return a*2+x;} 7 9 static function startsWith(s:String,head:String):Bool { 8 10 return s.substr(0,head.length)==head; 9 11 } 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() { 11 24 var a:Array<Dynamic>=[10,function(x:Int){return x*2;},2]; 12 25 a.push(function (t:String) { … … 28 41 var p=new Parser("abc"); 29 42 30 31 43 /* 32 44 var f:IntF=function (a:Int){return a*2;}; -
lang/haxe/Tonyu2/Test.hx
r35669 r35690 18 18 class Test { 19 19 static function nop(c:Context){} 20 static function pass1(g:Gen) {return func iton(c:Context){g.pass1(c);}}20 static function pass1(g:Gen) {return function(c:Context){g.pass1(c);}} 21 21 static function elem(t:Parser) { 22 return parse(t.tryThese(const,_var));22 return t.parse(t.either([const,_var])); 23 23 } 24 24 static function const(t:Parser) { … … 44 44 c.out(x[0]); 45 45 x[1].gen(c); 46 res=res+cast(x[1],Int);46 //res=res+cast(x[1],Int); 47 47 } 48 48 }
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)