Changeset 35664
- Timestamp:
- 10/21/09 20:34:30 (4 years ago)
- Location:
- lang/haxe/Tonyu2
- Files:
-
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/haxe/Tonyu2/Parser.hx
r35663 r35664 6 6 public function new(mesg:String){this.message=mesg;} 7 7 } 8 typedef ParserSub = Void->Dynamic;8 typedef ParserSub = Parser->Dynamic; 9 9 //public delegate object ParserSub(); 10 10 //public delegate void VoidSub(); 11 11 class Parser { 12 12 var input:String; 13 var context ;13 var context:Dynamic; 14 14 var p:Int; 15 15 var maxErrorPos:Int; … … 21 21 public var rest(getRest,null):String; 22 22 function getRest():String { 23 return input. Substring(p);23 return input.substr(p); 24 24 } 25 25 public function proceed(by:Int):Int {return p+=by;} 26 public var eos(isEOS,null):Bool ean;27 function isEOS():Bool ean{28 return p>=rest. Length;26 public var eos(isEOS,null):Bool; 27 function isEOS():Bool { 28 return p>=rest.length; 29 29 } 30 30 var lastError:String; … … 61 61 var message:String=match+" expected"; 62 62 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); 66 66 return m; 67 67 } 68 raise(message);68 t.raise(message); 69 69 return null; 70 70 }; 71 71 } else if (Std.is(match , EReg)) { 72 var message= match+" expected";72 var message=Std.string(match)+" expected"; 73 73 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); 79 79 return r.matched(0); 80 80 } 81 raise(message);81 t.raise(message); 82 82 return null; 83 83 }; … … 101 101 public function cache(name:String, sub:ParserSub ) { 102 102 trace("Parsing "+name); 103 return sub( );103 return sub(this); 104 104 } 105 105 //# combinator 106 106 public function seq(seq:Array<Dynamic>):ParserSub { 107 107 var cls= toClosures(seq); 108 return function( ) {108 return function(t:Parser) { 109 109 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)); 112 113 } 113 114 return res; … … 115 116 } 116 117 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 { 120 121 var subs=toClosures(_); 121 return function ( ) {122 return function (t:Parser) { 122 123 var res=null; 123 //#my $trID=rand(10000); 124 var trID=100; 124 var trID=Std.random(10000); 125 125 trace("Trying "+trID); 126 126 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(); 129 130 lastError=null; 130 131 try { 131 res=sub( );132 res=sub(t); 132 133 } catch (p:ParseError) { 133 134 lastError=p; 134 restoreState(st);135 t.restoreState(st); 135 136 } 136 137 if (lastError==null) {trace("Trial "+trID+" OK res="+res); return res;} … … 149 150 } 150 151 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); 153 154 if (res.length==1) return res[0]; 154 155 return null; … … 156 157 } 157 158 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) { 160 161 var res=[]; 161 while (res. Count<max) {162 while (res.length<max) { 162 163 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); 165 166 if (suc) { 166 167 res.push(tres); … … 169 170 } 170 171 } 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"); 173 176 //#if ($cnt!=@res) {die("Why $cnt ".scalar(@res));} 174 177 return res; -
lang/haxe/Tonyu2/Test.hx
r35663 r35664 1 1 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"); 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); 9 10 } 10 11 } 11 12 } 12 13 class Test { 13 public static void Main() {14 new TestParser(" aho baka").parse();14 static function main() { 15 new TestParser(" (1+2)*3 ").parse(); 15 16 //System.Console.Write("Test"); 16 17 } -
lang/haxe/Tonyu2/make.hxml
r35663 r35664 10 10 -neko scratch.n 11 11 -main Scratch.hx 12 13 --next 14 -neko parser.n 15 -main Test.hx
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)