Changeset 28557
- Timestamp:
- 01/17/09 20:52:36 (4 years ago)
- Location:
- lang/javascript/nohada/js/parser
- Files:
-
- 1 added
- 2 modified
-
Parser.js (modified) (6 diffs)
-
ParserTest.js (modified) (1 diff)
-
TParserTest.js (added)
Legend:
- Unmodified
- Added
- Removed
-
lang/javascript/nohada/js/parser/Parser.js
r28524 r28557 5 5 }, 6 6 parse: function (grammar) { 7 grammar.parse(this); 7 /*if (grammar instanceof Grammar) { 8 return grammar.parse(this); 9 }*/ 10 if (grammar instanceof Function) { 11 return grammar(this); 12 } 13 throw "Not parseable : "+grammar; 8 14 }, 9 15 getTrailString: function () { … … 18 24 match: function (str) { 19 25 var t=this.getTrailString(); 20 if (str instanceof Grammar) {21 return str. parse(this);26 if (str instanceof Function) { 27 return str.apply(this.curObj,[this]); 22 28 } 23 29 if (typeof(str)=="string") { … … 26 32 return str; 27 33 } 28 this.parseError("String '"+str+"' Expected ");34 this.parseError("String '"+str+"' Expected at "+t ); 29 35 } 30 36 if (str instanceof RegExp) { … … 37 43 return res; 38 44 } 39 this.parseError("Regex '"+str+"' Expected ");45 this.parseError("Regex '"+str+"' Expected at "+t ); 40 46 } 41 47 this.parseError("Invalid element "+str); … … 45 51 } 46 52 }); 47 Grammar=Class.create({ 48 initialize: function (elems) { 49 this.elems=elems.map(function (e,i) { 50 if (e instanceof Function) { 51 return function (p) { 52 return e.apply(p.curObj,[p]); 53 }; 53 function gram() { 54 var elems=$A(arguments); 55 /*elems=elems.map(function (e) { 56 if (e instanceof Array) { 57 var rept=e.pop(); 58 var g=gram.apply(this,e); 59 e.push(rept); 60 if (rept=="*") { 61 return gramRepeat(g,0); 54 62 } 55 return function (p) { 56 return p.match(e); 57 }; 58 }); 59 }, 60 parse: function (parser) { 63 if (rept=="+") { 64 return gramRepeat(g,1); 65 } 66 return gramMaybe(g); 67 } 68 return e; 69 });*/ 70 var _this; 71 _this=function (parser) { 61 72 if (typeof(parser)=="string") { 62 73 var p=new Parser(parser); 63 return this.parse(p);74 return p.parse(_this); 64 75 } 65 76 var sv=parser.saveState(); 66 77 try { 67 78 var svCur=parser.curObj; 68 parser.curObj={}; 69 var res; 70 for (var i=0 ; i<this.elems.length ; i++) { 71 var e=this.elems[i]; 72 res=e(parser); 73 parser.curObj[i]=res; 74 } 75 //alert (" ARY "+Object.toJSON(parser.curObj)); 76 parser.length=this.elems.length; 79 var res=[]; 80 parser.curObj=res; 81 elems.each(function (e) { 82 res.push(parser.match(e)); 83 }); 77 84 parser.curObj=svCur; 85 //alert("P "+Object.toJSON(res)); 78 86 return res; 79 87 } catch(e) { … … 81 89 throw e; 82 90 } 83 } 84 85 }); 86 function gram() { 87 var elems=$A(arguments); 88 return new Grammar(elems); 91 }; 92 return _this; 89 93 } 94 function gramRepeat(grm,min) { 95 return function (p) { 96 var sv; 97 var res=[]; 98 try { 99 while (true) { 100 sv=parser.saveState(); 101 res.push(grm(p)); 102 } 103 } catch(e) { 104 parser.restoreState(sv); 105 if (res.length>=min) return res; 106 throw e; 107 } 108 } 109 } 110 111 112 -
lang/javascript/nohada/js/parser/ParserTest.js
r28524 r28557 5 5 var res=tag("span","X"); 6 6 TagBuilder.write([text,res]); 7 var num=gram(/[0-9]+/,function (p) { 8 //alert(Object.toJSON(this)); 9 var s=this; 7 function num(p) { 8 var s=p.parse(gram(/[0-9]+/)); 10 9 return parseInt(s[0]); 11 }); 12 var g=gram(num,/[\+\-]/,num,function (p) { 13 //alert(Object.toJSON(this)); 14 15 var s=this; 16 var op=s[1]; 10 } 11 function g(p) { 12 var s=p.parse( gram(num,gramRepeat(grm(/[\+\-]/,num),0))); 13 //alert(Object.toJSON(s)); 14 var head=s[0]; 15 var tail=s[1]; 16 tail.each 17 17 if (op=="+") return s[0]+s[2]; 18 18 if (op=="-") return s[0]-s[2]; 19 } );19 } 20 20 function calc() { 21 res.set( g.parse(text.get()) );21 res.set( new Parser(text.get()).parse(g) ); 22 22 } 23 23 }
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)