package { class CompactTokenizer { private var tokens:Array = []; private var tok:String = ""; function CompactTokenizer(source:String):void{ tokens=source.split(/(\[|\]|\n|@|[^\[\]\n@]+)/).filter(notEmpty); } private function notEmpty(element:*,index:int,a:Array):Boolean{ return element.length>0 && !element.match(/^\n? *$/); } public function nextToken():String{ return tok = tokens.length==0 ? null : tokens.shift(); } public function token():String { return tok; } public function skip(sym:String){ if(token()==sym) return nextToken(); else throw new ArgumentError("skip:"+sym+" expected but "+ token()+ " found"); } } }