Repository: shepherdwind/velocity.js (ts)

Issue:
$!a.b， 若a不存在，会报错
$!a.b， 若a不存在，线上解析没问题，mock会js报错

推荐修改src/compile/references.js

    utils.some(ast.path, function(property){
      //第三个参数，返回后面的参数ast
      ret = ret && this.getAttributes(property, ret, ast);
    }, this);

Pull request:
Runt support
1. close #54 
2. runt support

```
     var vm = '$page.header(page)'
     assert.equal('$page.header(page)', render(vm))
```

Patch:
diff --git a/src/compile/references.js b/src/compile/references.js
index bb625ef..c717ed0 100644
--- a/src/compile/references.js
+++ b/src/compile/references.js
@@ -175,6 +175,11 @@ module.exports = function(Velocity, utils) {
      * @private
      */
     getAttributes: function(property, baseRef, ast) {
+      // fix #54
+      if (baseRef === null || baseRef === undefined) {
+        return undefined;
+      }
+
       /**
        * type对应着velocity.yy中的attribute，三种类型: method, index, property
        */
diff --git a/src/helper/text.js b/src/helper/text.js
index e8c677f..826b36d 100644
--- a/src/helper/text.js
+++ b/src/helper/text.js
@@ -86,6 +86,7 @@ module.exports = function(Helper, utils){
       }
 
       case 'integer':
+      case 'runt':
       case 'bool'   : {
         ret = ast.value;
         break;
diff --git a/src/parse/index.js b/src/parse/index.js
index 6818b38..3efd7b8 100644
--- a/src/parse/index.js
+++ b/src/parse/index.js
@@ -72,12 +72,12 @@
   }
 */
 var parser = (function(){
-var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,8],$V1=[1,9],$V2=[1,19],$V3=[1,10],$V4=[1,23],$V5=[1,22],$V6=[4,10,11,20,34,35,80],$V7=[1,27],$V8=[1,30],$V9=[1,31],$Va=[4,10,11,20,23,34,35,45,46,47,50,51,52,53,54,55,56,57,58,59,60,61,62,73,80,82,92],$Vb=[1,47],$Vc=[1,52],$Vd=[1,53],$Ve=[1,67],$Vf=[1,68],$Vg=[1,79],$Vh=[1,90],$Vi=[1,82],$Vj=[1,80],$Vk=[1,85],$Vl=[1,89],$Vm=[1,86],$Vn=[1,87],$Vo=[4,10,11,20,23,34,35,45,46,47,50,51,52,53,54,55,56,57,58,59,60,61,62,72,73,78,80,81,82,92],$Vp=[1,116],$Vq=[1,112],$Vr=[1,113],$Vs=[1,124],$Vt=[23,46,82],$Vu=[2,90],$Vv=[23,45,46,73,82],$Vw=[23,45,46,50,51,52,53,54,55,56,57,58,59,60,61,62,73,80,82],$Vx=[23,45,46,50,51,52,53,54,55,56,57,58,59,60,61,62,73,80,82,94],$Vy=[2,103],$Vz=[23,45,46,50,51,52,53,54,55,56,57,58,59,60,61,62,73,80,82,92],$VA=[2,106],$VB=[1,133],$VC=[1,139],$VD=[23,45,46],$VE=[1,144],$VF=[1,145],$VG=[1,146],$VH=[1,147],$VI=[1,148],$VJ=[1,149],$VK=[1,150],$VL=[1,151],$VM=[1,152],$VN=[1,153],$VO=[1,154],$VP=[1,155],$VQ=[1,156],$VR=[23,50,51,52,53,54,55,56,57,58,59,60,61,62],$VS=[46,82],$VT=[2,107],$VU=[23,34],$VV=[1,203],$VW=[1,202],$VX=[46,73],$VY=[23,50,51],$VZ=[23,50,51,52,53,57,58,59,60,61,62],$V_=[23,50,51,57,58,59,60,61,62];
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,8],$V1=[1,9],$V2=[1,19],$V3=[1,10],$V4=[1,23],$V5=[1,22],$V6=[4,10,11,20,34,35,80],$V7=[1,27],$V8=[1,30],$V9=[1,31],$Va=[4,10,11,20,23,34,35,45,46,47,50,51,52,53,54,55,56,57,58,59,60,61,62,73,80,82,92],$Vb=[1,47],$Vc=[1,52],$Vd=[1,53],$Ve=[1,67],$Vf=[1,68],$Vg=[1,80],$Vh=[1,75],$Vi=[1,91],$Vj=[1,83],$Vk=[1,81],$Vl=[1,86],$Vm=[1,90],$Vn=[1,87],$Vo=[1,88],$Vp=[4,10,11,20,23,34,35,45,46,47,50,51,52,53,54,55,56,57,58,59,60,61,62,72,73,78,80,81,82,92],$Vq=[1,117],$Vr=[1,113],$Vs=[1,114],$Vt=[1,125],$Vu=[23,46,82],$Vv=[2,91],$Vw=[23,45,46,73,82],$Vx=[23,45,46,50,51,52,53,54,55,56,57,58,59,60,61,62,73,80,82],$Vy=[23,45,46,50,51,52,53,54,55,56,57,58,59,60,61,62,73,80,82,94],$Vz=[2,104],$VA=[23,45,46,50,51,52,53,54,55,56,57,58,59,60,61,62,73,80,82,92],$VB=[2,107],$VC=[1,134],$VD=[1,140],$VE=[23,45,46],$VF=[1,145],$VG=[1,146],$VH=[1,147],$VI=[1,148],$VJ=[1,149],$VK=[1,150],$VL=[1,151],$VM=[1,152],$VN=[1,153],$VO=[1,154],$VP=[1,155],$VQ=[1,156],$VR=[1,157],$VS=[23,50,51,52,53,54,55,56,57,58,59,60,61,62],$VT=[46,82],$VU=[2,108],$VV=[23,34],$VW=[1,204],$VX=[1,203],$VY=[46,73],$VZ=[23,50,51],$V_=[23,50,51,52,53,57,58,59,60,61,62],$V$=[23,50,51,57,58,59,60,61,62];
 var parser = {trace: function trace() { },
 yy: {},
 symbols_: {"error":2,"root":3,"EOF":4,"statements":5,"statement":6,"references":7,"directives":8,"content":9,"RAW":10,"COMMENT":11,"set":12,"if":13,"elseif":14,"else":15,"end":16,"foreach":17,"break":18,"define":19,"HASH":20,"NOESCAPE":21,"PARENTHESIS":22,"CLOSE_PARENTHESIS":23,"macro":24,"macro_call":25,"SET":26,"equal":27,"IF":28,"expression":29,"ELSEIF":30,"ELSE":31,"END":32,"FOREACH":33,"DOLLAR":34,"ID":35,"IN":36,"array":37,"BREAK":38,"DEFINE":39,"MACRO":40,"macro_args":41,"macro_call_args_all":42,"macro_call_args":43,"literals":44,"SPACE":45,"COMMA":46,"EQUAL":47,"map":48,"math":49,"||":50,"&&":51,"+":52,"-":53,"*":54,"/":55,"%":56,">":57,"<":58,"==":59,">=":60,"<=":61,"!=":62,"parenthesis":63,"!":64,"literal":65,"brace_begin":66,"attributes":67,"brace_end":68,"methodbd":69,"VAR_BEGIN":70,"MAP_BEGIN":71,"VAR_END":72,"MAP_END":73,"attribute":74,"method":75,"index":76,"property":77,"DOT":78,"params":79,"CONTENT":80,"BRACKET":81,"CLOSE_BRACKET":82,"string":83,"number":84,"BOOL":85,"integer":86,"INTEGER":87,"DECIMAL_POINT":88,"STRING":89,"EVAL_STRING":90,"range":91,"RANGE":92,"map_item":93,"MAP_SPLIT":94,"$accept":0,"$end":1},
 terminals_: {2:"error",4:"EOF",10:"RAW",11:"COMMENT",20:"HASH",21:"NOESCAPE",22:"PARENTHESIS",23:"CLOSE_PARENTHESIS",26:"SET",28:"IF",30:"ELSEIF",31:"ELSE",32:"END",33:"FOREACH",34:"DOLLAR",35:"ID",36:"IN",38:"BREAK",39:"DEFINE",40:"MACRO",45:"SPACE",46:"COMMA",47:"EQUAL",50:"||",51:"&&",52:"+",53:"-",54:"*",55:"/",56:"%",57:">",58:"<",59:"==",60:">=",61:"<=",62:"!=",64:"!",70:"VAR_BEGIN",71:"MAP_BEGIN",72:"VAR_END",73:"MAP_END",78:"DOT",80:"CONTENT",81:"BRACKET",82:"CLOSE_BRACKET",85:"BOOL",87:"INTEGER",88:"DECIMAL_POINT",89:"STRING",90:"EVAL_STRING",92:"RANGE",94:"MAP_SPLIT"},
-productions_: [0,[3,1],[3,2],[5,1],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,4],[8,1],[8,1],[12,5],[13,5],[14,5],[15,2],[16,2],[17,8],[17,8],[18,2],[19,6],[24,6],[24,5],[41,1],[41,2],[25,5],[25,4],[43,1],[43,1],[43,3],[43,3],[43,3],[43,3],[42,1],[42,2],[42,3],[42,2],[27,3],[29,1],[29,1],[29,1],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,1],[49,2],[49,2],[49,1],[49,1],[63,3],[7,5],[7,3],[7,5],[7,3],[7,2],[7,4],[7,2],[7,4],[66,1],[66,1],[68,1],[68,1],[67,1],[67,2],[74,1],[74,1],[74,1],[75,2],[69,4],[69,3],[79,1],[79,1],[79,3],[79,3],[77,2],[77,2],[76,3],[76,3],[76,3],[76,2],[76,2],[65,1],[65,1],[65,1],[84,1],[84,3],[84,4],[86,1],[86,2],[83,1],[83,1],[44,1],[44,1],[44,1],[37,3],[37,1],[37,2],[91,5],[91,5],[91,5],[91,5],[48,3],[48,2],[93,3],[93,3],[93,2],[93,5],[93,5],[9,1],[9,1],[9,2],[9,3],[9,3],[9,2]],
+productions_: [0,[3,1],[3,2],[5,1],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,4],[8,1],[8,1],[12,5],[13,5],[14,5],[15,2],[16,2],[17,8],[17,8],[18,2],[19,6],[24,6],[24,5],[41,1],[41,2],[25,5],[25,4],[43,1],[43,1],[43,3],[43,3],[43,3],[43,3],[42,1],[42,2],[42,3],[42,2],[27,3],[29,1],[29,1],[29,1],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,3],[49,1],[49,2],[49,2],[49,1],[49,1],[63,3],[7,5],[7,3],[7,5],[7,3],[7,2],[7,4],[7,2],[7,4],[66,1],[66,1],[68,1],[68,1],[67,1],[67,2],[74,1],[74,1],[74,1],[75,2],[69,4],[69,3],[79,1],[79,1],[79,1],[79,3],[79,3],[77,2],[77,2],[76,3],[76,3],[76,3],[76,2],[76,2],[65,1],[65,1],[65,1],[84,1],[84,3],[84,4],[86,1],[86,2],[83,1],[83,1],[44,1],[44,1],[44,1],[37,3],[37,1],[37,2],[91,5],[91,5],[91,5],[91,5],[48,3],[48,2],[93,3],[93,3],[93,2],[93,5],[93,5],[9,1],[9,1],[9,2],[9,3],[9,3],[9,2]],
 performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
 /* this == yyval */
 
@@ -89,7 +89,7 @@ break;
 case 2:
  return $$[$0-1]; 
 break;
-case 3: case 32: case 36: case 37: case 81: case 89: case 90:
+case 3: case 32: case 36: case 37: case 81: case 89: case 91:
  this.$ = [$$[$0]]; 
 break;
 case 4: case 33: case 82:
@@ -101,7 +101,7 @@ break;
 case 6:
  $$[$0].pos = this._$; this.$ = $$[$0]; 
 break;
-case 7: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 19: case 20: case 42: case 43: case 47: case 48: case 49: case 63: case 66: case 67: case 77: case 78: case 79: case 80: case 86: case 93: case 100: case 101: case 106: case 112: case 114: case 127: case 128:
+case 7: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 19: case 20: case 42: case 43: case 47: case 48: case 49: case 63: case 66: case 67: case 77: case 78: case 79: case 80: case 86: case 94: case 101: case 102: case 107: case 113: case 115: case 128: case 129:
  this.$ = $$[$0]; 
 break;
 case 8:
@@ -149,10 +149,10 @@ break;
 case 35:
  this.$ = { type:"macro_call", id: $$[$0-2].replace(/^\s+|\s+$/g, '') }; 
 break;
-case 38: case 39: case 40: case 41: case 91: case 92:
+case 38: case 39: case 40: case 41: case 92: case 93:
  this.$ = [].concat($$[$0-2], $$[$0]); 
 break;
-case 44: case 45: case 95: case 96:
+case 44: case 45: case 96: case 97:
  this.$ = $$[$0-1]; 
 break;
 case 46:
@@ -209,76 +209,79 @@ break;
 case 88:
  this.$ = {id: $$[$0-2], args: false }; 
 break;
-case 94:
+case 90:
+ this.$ = [ { type: 'runt', value: $$[$0] } ]; 
+break;
+case 95:
  this.$ = {type: 'content', value: $$[$0-1] + $$[$0] }; 
 break;
-case 97:
+case 98:
  this.$ = {type: "content", value: $$[$0-2] + $$[$0-1].value + $$[$0] }; 
 break;
-case 98: case 99:
+case 99: case 100:
  this.$ = {type: "content", value: $$[$0-1] + $$[$0] }; 
 break;
-case 102:
+case 103:
  this.$ = {type: 'bool', value: $$[$0] }; 
 break;
-case 103:
+case 104:
  this.$ = {type: "integer", value: $$[$0]}; 
 break;
-case 104:
+case 105:
  this.$ = {type: "decimal", value: + ($$[$0-2] + '.' + $$[$0]) }; 
 break;
-case 105:
+case 106:
  this.$ = {type: "decimal", value: - ($$[$0-2] + '.' + $$[$0]) }; 
 break;
-case 107:
+case 108:
  this.$ = - parseInt($$[$0], 10); 
 break;
-case 108:
+case 109:
  this.$ = {type: 'string', value: $$[$0] }; 
 break;
-case 109:
+case 110:
  this.$ = {type: 'string', value: $$[$0], isEval: true }; 
 break;
-case 110: case 111:
+case 111: case 112:
  this.$ = $$[$0];
 break;
-case 113:
+case 114:
  this.$ = {type: 'array', value: $$[$0-1] }; 
 break;
-case 115:
+case 116:
  this.$ = {type: 'array', value: [] }; 
 break;
-case 116: case 117: case 118: case 119:
+case 117: case 118: case 119: case 120:
  this.$ = {type: 'array', isRange: true, value: [$$[$0-3], $$[$0-1]]}; 
 break;
-case 120:
+case 121:
  this.$ = {type: 'map', value: $$[$0-1] }; 
 break;
-case 121:
+case 122:
  this.$ = {type: 'map'}; 
 break;
-case 122: case 123:
+case 123: case 124:
  this.$ = {}; this.$[$$[$0-2].value] = $$[$0]; 
 break;
-case 124:
+case 125:
  this.$ = {}; this.$[$$[$0-1].value] = $$[$01]; 
 break;
-case 125: case 126:
+case 126: case 127:
  this.$ = $$[$0-4]; this.$[$$[$0-2].value] = $$[$0]; 
 break;
-case 129: case 132:
+case 130: case 133:
  this.$ = $$[$0-1] + $$[$0]; 
 break;
-case 130:
+case 131:
  this.$ = $$[$0-2] + $$[$0-1] + $$[$0]; 
 break;
-case 131:
+case 132:
  this.$ = $$[$0-2] + $$[$0-1]; 
 break;
 }
 },
-table: [{3:1,4:[1,2],5:3,6:4,7:5,8:6,9:7,10:$V0,11:$V1,12:11,13:12,14:13,15:14,16:15,17:16,18:17,19:18,20:$V2,24:20,25:21,34:$V3,35:$V4,80:$V5},{1:[3]},{1:[2,1]},{4:[1,24],6:25,7:5,8:6,9:7,10:$V0,11:$V1,12:11,13:12,14:13,15:14,16:15,17:16,18:17,19:18,20:$V2,24:20,25:21,34:$V3,35:$V4,80:$V5},o($V6,[2,3]),o($V6,[2,5]),o($V6,[2,6]),o($V6,[2,7]),o($V6,[2,8]),o($V6,[2,9]),{35:$V7,66:26,69:28,70:$V8,71:$V9,80:[1,29]},o($V6,[2,10]),o($V6,[2,11]),o($V6,[2,12]),o($V6,[2,13]),o($V6,[2,14]),o($V6,[2,15]),o($V6,[2,16]),o($V6,[2,17]),{21:[1,32],26:[1,35],28:[1,36],30:[1,37],31:[1,38],32:[1,39],33:[1,40],35:[1,34],38:[1,41],39:[1,42],40:[1,43],80:[1,33]},o($V6,[2,19]),o($V6,[2,20]),o($V6,[2,127]),o($V6,[2,128]),{1:[2,2]},o($V6,[2,4]),{35:[1,44],69:45},o($Va,[2,73],{67:46,74:48,75:49,76:50,77:51,22:$Vb,78:$Vc,81:$Vd}),o($Va,[2,75],{74:48,75:49,76:50,77:51,67:54,78:$Vc,81:$Vd}),o($V6,[2,132]),{35:[2,77]},{35:[2,78]},{22:[1,55]},o($V6,[2,129]),{4:[1,57],22:[1,58],80:[1,56]},{22:[1,59]},{22:[1,60]},{22:[1,61]},o($V6,[2,24]),o($V6,[2,25]),{22:[1,62]},o($V6,[2,28]),{22:[1,63]},{22:[1,64]},{22:$Vb,67:65,68:66,72:$Ve,73:$Vf,74:48,75:49,76:50,77:51,78:$Vc,81:$Vd},{67:69,68:70,72:$Ve,73:$Vf,74:48,75:49,76:50,77:51,78:$Vc,81:$Vd},o($Va,[2,70],{75:49,76:50,77:51,74:71,78:$Vc,81:$Vd}),{7:75,23:[1,73],34:$Vg,37:76,44:74,48:77,53:$Vh,65:78,71:$Vi,79:72,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},o($Vo,[2,81]),o($Vo,[2,83]),o($Vo,[2,84]),o($Vo,[2,85]),{35:[1,92],69:91,80:[1,93]},{7:95,34:$Vg,53:$Vh,65:94,80:[1,96],82:[1,97],83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},o($Va,[2,72],{75:49,76:50,77:51,74:71,78:$Vc,81:$Vd}),{23:[1,98]},o($V6,[2,130]),o($V6,[2,131]),{7:104,23:[1,100],34:$Vg,37:76,42:99,43:101,44:103,45:[1,102],48:77,53:$Vh,65:78,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},{7:106,27:105,34:$Vg},{7:114,22:$Vp,29:107,34:$Vg,37:108,48:109,49:110,53:$Vq,63:111,64:$Vr,65:115,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},{7:114,22:$Vp,29:117,34:$Vg,37:108,48:109,49:110,53:$Vq,63:111,64:$Vr,65:115,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},{34:[1,118]},{34:[1,119]},{35:[1,120]},{68:121,72:$Ve,73:$Vf,74:71,75:49,76:50,77:51,78:$Vc,81:$Vd},o($Va,[2,74]),o($Va,[2,79]),o($Va,[2,80]),{68:122,72:$Ve,73:$Vf,74:71,75:49,76:50,77:51,78:$Vc,81:$Vd},o($Va,[2,76]),o($Vo,[2,82]),{23:[1,123],46:$Vs},o($Vo,[2,88]),o($Vt,[2,89]),o([23,46],$Vu),o($Vv,[2,110]),o($Vv,[2,111]),o($Vv,[2,112]),{35:$V7,66:26,69:28,70:$V8,71:$V9},{7:128,34:$Vg,37:76,44:74,48:77,53:$Vh,65:78,71:$Vi,79:125,81:$Vj,82:[1,126],83:83,84:84,85:$Vk,86:127,87:$Vl,89:$Vm,90:$Vn,91:81},o($Vv,[2,114]),{73:[1,130],83:131,89:$Vm,90:$Vn,93:129},o($Vw,[2,100]),o($Vw,[2,101]),o($Vw,[2,102]),o($Vx,[2,108]),o($Vx,[2,109]),o($Vw,$Vy),o($Vz,$VA,{88:[1,132]}),{87:$VB},o($Vo,[2,86]),o($Vo,[2,93],{22:$Vb}),o($Vo,[2,94]),{80:[1,135],82:[1,134]},{82:[1,136]},o($Vo,[2,98]),o($Vo,[2,99]),o($V6,[2,18]),{23:[1,137]},o($V6,[2,35]),{23:[2,42],45:[1,138],46:$VC},{7:104,34:$Vg,37:76,43:140,44:103,48:77,53:$Vh,65:78,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},o($VD,[2,36]),o($VD,[2,37]),{23:[1,141]},{47:[1,142]},{23:[1,143]},{23:[2,47]},{23:[2,48]},{23:[2,49],50:$VE,51:$VF,52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK,57:$VL,58:$VM,59:$VN,60:$VO,61:$VP,62:$VQ},o($VR,[2,63]),{22:$Vp,63:157,87:$VB},{7:114,22:$Vp,34:$Vg,49:158,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},o($VR,[2,66]),o($VR,[2,67]),{7:114,22:$Vp,34:$Vg,49:159,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{23:[1,160]},{35:[1,161]},{35:[1,162]},{7:165,23:[1,164],34:$Vg,41:163},o($Va,[2,69]),o($Va,[2,71]),o($Vo,[2,87]),{7:167,34:$Vg,37:76,44:166,48:77,53:$Vh,65:78,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},{46:$Vs,82:[1,168]},o($Vv,[2,115]),o($VS,$Vy,{92:[1,169]}),o($VS,$Vu,{92:[1,170]}),{46:[1,172],73:[1,171]},o($Vv,[2,121]),{94:[1,173]},{87:[1,174]},o($Vz,$VT,{88:[1,175]}),o($Vo,[2,95]),o($Vo,[2,97]),o($Vo,[2,96]),o($V6,[2,34]),{7:177,23:[2,45],34:$Vg,37:76,44:176,48:77,53:$Vh,65:78,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},{7:179,34:$Vg,37:76,44:178,48:77,53:$Vh,65:78,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},{23:[2,43],45:[1,180],46:$VC},o($V6,[2,21]),{7:114,22:$Vp,29:181,34:$Vg,37:108,48:109,49:110,53:$Vq,63:111,64:$Vr,65:115,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},o($V6,[2,22]),{7:114,22:$Vp,34:$Vg,49:182,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:183,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:184,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:185,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:186,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:187,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:188,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:189,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:190,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:191,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:192,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:193,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},{7:114,22:$Vp,34:$Vg,49:194,53:$Vq,63:111,64:$Vr,65:115,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn},o($VR,[2,64]),o($VR,[2,65]),{23:[1,195],50:$VE,51:$VF,52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK,57:$VL,58:$VM,59:$VN,60:$VO,61:$VP,62:$VQ},o($V6,[2,23]),{36:[1,196]},{23:[1,197]},{7:199,23:[1,198],34:$Vg},o($V6,[2,31]),o($VU,[2,32]),o($Vt,[2,91]),o($Vt,[2,92]),o($Vv,[2,113]),{7:201,34:$Vg,53:$VV,86:200,87:$VW},{7:205,34:$Vg,53:$VV,86:204,87:$VW},o($Vv,[2,120]),{83:206,89:$Vm,90:$Vn},o($VX,[2,124],{37:76,48:77,65:78,91:81,83:83,84:84,86:88,44:207,7:208,34:$Vg,53:$Vh,71:$Vi,81:$Vj,85:$Vk,87:$Vl,89:$Vm,90:$Vn}),o($Vw,[2,104]),{87:[1,209]},o($VD,[2,38]),o($VD,[2,41]),o($VD,[2,39]),o($VD,[2,40]),{7:177,23:[2,44],34:$Vg,37:76,44:176,48:77,53:$Vh,65:78,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},{23:[2,46]},o($VY,[2,50],{52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK,57:$VL,58:$VM,59:$VN,60:$VO,61:$VP,62:$VQ}),o($VY,[2,51],{52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK,57:$VL,58:$VM,59:$VN,60:$VO,61:$VP,62:$VQ}),o($VZ,[2,52],{54:$VI,55:$VJ,56:$VK}),o($VZ,[2,53],{54:$VI,55:$VJ,56:$VK}),o($VR,[2,54]),o($VR,[2,55]),o($VR,[2,56]),o($V_,[2,57],{52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK}),o($V_,[2,58],{52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK}),o($V_,[2,59],{52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK}),o($V_,[2,60],{52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK}),o($V_,[2,61],{52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK}),o($V_,[2,62],{52:$VG,53:$VH,54:$VI,55:$VJ,56:$VK}),o($VR,[2,68]),{7:210,34:$Vg,37:211,81:$Vj,91:81},o($V6,[2,29]),o($V6,[2,30]),o($VU,[2,33]),{82:[1,212]},{82:[1,213]},{82:$VA},{87:[1,214]},{82:[1,215]},{82:[1,216]},{94:[1,217]},o($VX,[2,122]),o($VX,[2,123]),o($Vw,[2,105]),{23:[1,218]},{23:[1,219]},o($Vv,[2,116]),o($Vv,[2,118]),{82:$VT},o($Vv,[2,117]),o($Vv,[2,119]),{7:220,34:$Vg,37:76,44:221,48:77,53:$Vh,65:78,71:$Vi,81:$Vj,83:83,84:84,85:$Vk,86:88,87:$Vl,89:$Vm,90:$Vn,91:81},o($V6,[2,26]),o($V6,[2,27]),o($VX,[2,125]),o($VX,[2,126])],
-defaultActions: {2:[2,1],24:[2,2],30:[2,77],31:[2,78],108:[2,47],109:[2,48],181:[2,46],202:[2,106],214:[2,107]},
+table: [{3:1,4:[1,2],5:3,6:4,7:5,8:6,9:7,10:$V0,11:$V1,12:11,13:12,14:13,15:14,16:15,17:16,18:17,19:18,20:$V2,24:20,25:21,34:$V3,35:$V4,80:$V5},{1:[3]},{1:[2,1]},{4:[1,24],6:25,7:5,8:6,9:7,10:$V0,11:$V1,12:11,13:12,14:13,15:14,16:15,17:16,18:17,19:18,20:$V2,24:20,25:21,34:$V3,35:$V4,80:$V5},o($V6,[2,3]),o($V6,[2,5]),o($V6,[2,6]),o($V6,[2,7]),o($V6,[2,8]),o($V6,[2,9]),{35:$V7,66:26,69:28,70:$V8,71:$V9,80:[1,29]},o($V6,[2,10]),o($V6,[2,11]),o($V6,[2,12]),o($V6,[2,13]),o($V6,[2,14]),o($V6,[2,15]),o($V6,[2,16]),o($V6,[2,17]),{21:[1,32],26:[1,35],28:[1,36],30:[1,37],31:[1,38],32:[1,39],33:[1,40],35:[1,34],38:[1,41],39:[1,42],40:[1,43],80:[1,33]},o($V6,[2,19]),o($V6,[2,20]),o($V6,[2,128]),o($V6,[2,129]),{1:[2,2]},o($V6,[2,4]),{35:[1,44],69:45},o($Va,[2,73],{67:46,74:48,75:49,76:50,77:51,22:$Vb,78:$Vc,81:$Vd}),o($Va,[2,75],{74:48,75:49,76:50,77:51,67:54,78:$Vc,81:$Vd}),o($V6,[2,133]),{35:[2,77]},{35:[2,78]},{22:[1,55]},o($V6,[2,130]),{4:[1,57],22:[1,58],80:[1,56]},{22:[1,59]},{22:[1,60]},{22:[1,61]},o($V6,[2,24]),o($V6,[2,25]),{22:[1,62]},o($V6,[2,28]),{22:[1,63]},{22:[1,64]},{22:$Vb,67:65,68:66,72:$Ve,73:$Vf,74:48,75:49,76:50,77:51,78:$Vc,81:$Vd},{67:69,68:70,72:$Ve,73:$Vf,74:48,75:49,76:50,77:51,78:$Vc,81:$Vd},o($Va,[2,70],{75:49,76:50,77:51,74:71,78:$Vc,81:$Vd}),{7:76,23:[1,73],34:$Vg,35:$Vh,37:77,44:74,48:78,53:$Vi,65:79,71:$Vj,79:72,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},o($Vp,[2,81]),o($Vp,[2,83]),o($Vp,[2,84]),o($Vp,[2,85]),{35:[1,93],69:92,80:[1,94]},{7:96,34:$Vg,53:$Vi,65:95,80:[1,97],82:[1,98],83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},o($Va,[2,72],{75:49,76:50,77:51,74:71,78:$Vc,81:$Vd}),{23:[1,99]},o($V6,[2,131]),o($V6,[2,132]),{7:105,23:[1,101],34:$Vg,37:77,42:100,43:102,44:104,45:[1,103],48:78,53:$Vi,65:79,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},{7:107,27:106,34:$Vg},{7:115,22:$Vq,29:108,34:$Vg,37:109,48:110,49:111,53:$Vr,63:112,64:$Vs,65:116,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},{7:115,22:$Vq,29:118,34:$Vg,37:109,48:110,49:111,53:$Vr,63:112,64:$Vs,65:116,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},{34:[1,119]},{34:[1,120]},{35:[1,121]},{68:122,72:$Ve,73:$Vf,74:71,75:49,76:50,77:51,78:$Vc,81:$Vd},o($Va,[2,74]),o($Va,[2,79]),o($Va,[2,80]),{68:123,72:$Ve,73:$Vf,74:71,75:49,76:50,77:51,78:$Vc,81:$Vd},o($Va,[2,76]),o($Vp,[2,82]),{23:[1,124],46:$Vt},o($Vp,[2,88]),o($Vu,[2,89]),o($Vu,[2,90]),o([23,46],$Vv),o($Vw,[2,111]),o($Vw,[2,112]),o($Vw,[2,113]),{35:$V7,66:26,69:28,70:$V8,71:$V9},{7:129,34:$Vg,35:$Vh,37:77,44:74,48:78,53:$Vi,65:79,71:$Vj,79:126,81:$Vk,82:[1,127],83:84,84:85,85:$Vl,86:128,87:$Vm,89:$Vn,90:$Vo,91:82},o($Vw,[2,115]),{73:[1,131],83:132,89:$Vn,90:$Vo,93:130},o($Vx,[2,101]),o($Vx,[2,102]),o($Vx,[2,103]),o($Vy,[2,109]),o($Vy,[2,110]),o($Vx,$Vz),o($VA,$VB,{88:[1,133]}),{87:$VC},o($Vp,[2,86]),o($Vp,[2,94],{22:$Vb}),o($Vp,[2,95]),{80:[1,136],82:[1,135]},{82:[1,137]},o($Vp,[2,99]),o($Vp,[2,100]),o($V6,[2,18]),{23:[1,138]},o($V6,[2,35]),{23:[2,42],45:[1,139],46:$VD},{7:105,34:$Vg,37:77,43:141,44:104,48:78,53:$Vi,65:79,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},o($VE,[2,36]),o($VE,[2,37]),{23:[1,142]},{47:[1,143]},{23:[1,144]},{23:[2,47]},{23:[2,48]},{23:[2,49],50:$VF,51:$VG,52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL,57:$VM,58:$VN,59:$VO,60:$VP,61:$VQ,62:$VR},o($VS,[2,63]),{22:$Vq,63:158,87:$VC},{7:115,22:$Vq,34:$Vg,49:159,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},o($VS,[2,66]),o($VS,[2,67]),{7:115,22:$Vq,34:$Vg,49:160,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{23:[1,161]},{35:[1,162]},{35:[1,163]},{7:166,23:[1,165],34:$Vg,41:164},o($Va,[2,69]),o($Va,[2,71]),o($Vp,[2,87]),{7:168,34:$Vg,37:77,44:167,48:78,53:$Vi,65:79,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},{46:$Vt,82:[1,169]},o($Vw,[2,116]),o($VT,$Vz,{92:[1,170]}),o($VT,$Vv,{92:[1,171]}),{46:[1,173],73:[1,172]},o($Vw,[2,122]),{94:[1,174]},{87:[1,175]},o($VA,$VU,{88:[1,176]}),o($Vp,[2,96]),o($Vp,[2,98]),o($Vp,[2,97]),o($V6,[2,34]),{7:178,23:[2,45],34:$Vg,37:77,44:177,48:78,53:$Vi,65:79,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},{7:180,34:$Vg,37:77,44:179,48:78,53:$Vi,65:79,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},{23:[2,43],45:[1,181],46:$VD},o($V6,[2,21]),{7:115,22:$Vq,29:182,34:$Vg,37:109,48:110,49:111,53:$Vr,63:112,64:$Vs,65:116,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},o($V6,[2,22]),{7:115,22:$Vq,34:$Vg,49:183,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:184,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:185,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:186,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:187,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:188,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:189,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:190,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:191,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:192,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:193,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:194,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},{7:115,22:$Vq,34:$Vg,49:195,53:$Vr,63:112,64:$Vs,65:116,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo},o($VS,[2,64]),o($VS,[2,65]),{23:[1,196],50:$VF,51:$VG,52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL,57:$VM,58:$VN,59:$VO,60:$VP,61:$VQ,62:$VR},o($V6,[2,23]),{36:[1,197]},{23:[1,198]},{7:200,23:[1,199],34:$Vg},o($V6,[2,31]),o($VV,[2,32]),o($Vu,[2,92]),o($Vu,[2,93]),o($Vw,[2,114]),{7:202,34:$Vg,53:$VW,86:201,87:$VX},{7:206,34:$Vg,53:$VW,86:205,87:$VX},o($Vw,[2,121]),{83:207,89:$Vn,90:$Vo},o($VY,[2,125],{37:77,48:78,65:79,91:82,83:84,84:85,86:89,44:208,7:209,34:$Vg,53:$Vi,71:$Vj,81:$Vk,85:$Vl,87:$Vm,89:$Vn,90:$Vo}),o($Vx,[2,105]),{87:[1,210]},o($VE,[2,38]),o($VE,[2,41]),o($VE,[2,39]),o($VE,[2,40]),{7:178,23:[2,44],34:$Vg,37:77,44:177,48:78,53:$Vi,65:79,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},{23:[2,46]},o($VZ,[2,50],{52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL,57:$VM,58:$VN,59:$VO,60:$VP,61:$VQ,62:$VR}),o($VZ,[2,51],{52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL,57:$VM,58:$VN,59:$VO,60:$VP,61:$VQ,62:$VR}),o($V_,[2,52],{54:$VJ,55:$VK,56:$VL}),o($V_,[2,53],{54:$VJ,55:$VK,56:$VL}),o($VS,[2,54]),o($VS,[2,55]),o($VS,[2,56]),o($V$,[2,57],{52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL}),o($V$,[2,58],{52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL}),o($V$,[2,59],{52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL}),o($V$,[2,60],{52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL}),o($V$,[2,61],{52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL}),o($V$,[2,62],{52:$VH,53:$VI,54:$VJ,55:$VK,56:$VL}),o($VS,[2,68]),{7:211,34:$Vg,37:212,81:$Vk,91:82},o($V6,[2,29]),o($V6,[2,30]),o($VV,[2,33]),{82:[1,213]},{82:[1,214]},{82:$VB},{87:[1,215]},{82:[1,216]},{82:[1,217]},{94:[1,218]},o($VY,[2,123]),o($VY,[2,124]),o($Vx,[2,106]),{23:[1,219]},{23:[1,220]},o($Vw,[2,117]),o($Vw,[2,119]),{82:$VU},o($Vw,[2,118]),o($Vw,[2,120]),{7:221,34:$Vg,37:77,44:222,48:78,53:$Vi,65:79,71:$Vj,81:$Vk,83:84,84:85,85:$Vl,86:89,87:$Vm,89:$Vn,90:$Vo,91:82},o($V6,[2,26]),o($V6,[2,27]),o($VY,[2,126]),o($VY,[2,127])],
+defaultActions: {2:[2,1],24:[2,2],30:[2,77],31:[2,78],109:[2,47],110:[2,48],182:[2,46],203:[2,107],215:[2,108]},
 parseError: function parseError(str, hash) {
     if (hash.recoverable) {
         this.trace(str);
@@ -932,7 +935,7 @@ case 59: return 4;
 break;
 }
 },
-rules: [/^(?:[^#]*?(?=\$))/,/^(?:[^\$]*?(?=#))/,/^(?:[^\x00]+)/,/^(?:#\*[\s\S]+?\*#)/,/^(?:#\[\[[\s\S]+?\]\]#)/,/^(?:##[^\n]+)/,/^(?:#(?=[a-zA-Z{]))/,/^(?:set[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:if[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:elseif[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:else\b)/,/^(?:\{else\})/,/^(?:end\b)/,/^(?:break\b)/,/^(?:foreach[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:noescape(?=[^a-zA-Z0-9_]+))/,/^(?:define[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:macro[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:in\b)/,/^(?:[%\+\-\*/])/,/^(?:<=)/,/^(?:>=)/,/^(?:[><])/,/^(?:==)/,/^(?:\|\|)/,/^(?:&&)/,/^(?:!=)/,/^(?:\$!(?=[{a-zA-Z_]))/,/^(?:\$(?=[{a-zA-Z_]))/,/^(?:!)/,/^(?:=)/,/^(?:[ ]+(?=[^,]))/,/^(?:\s+)/,/^(?:\{)/,/^(?:\})/,/^(?::[\s]*)/,/^(?:\{)/,/^(?:\})/,/^(?:\([\s]*(?=[$'"\[\{\-0-9\w()!]))/,/^(?:\))/,/^(?:\[[\s]*(?=[\-$"'0-9{\[\]]+))/,/^(?:\])/,/^(?:\.\.)/,/^(?:\.(?=[a-zA-Z_]))/,/^(?:\.(?=[\d]))/,/^(?:,[ ]*)/,/^(?:"(\\"|[^\"])*")/,/^(?:'(\\'|[^\'])*')/,/^(?:null\b)/,/^(?:false\b)/,/^(?:true\b)/,/^(?:[0-9]+)/,/^(?:[_a-zA-Z][a-zA-Z0-9_\-]*)/,/^(?:[_a-zA-Z][a-zA-Z0-9_\-]*[ ]*(?=\())/,/^(?:#)/,/^(?:.)/,/^(?:\s+)/,/^(?:[\$#])/,/^(?:$)/,/^(?:$)/],
+rules: [/^(?:[^#]*?(?=\$))/,/^(?:[^\$]*?(?=#))/,/^(?:[^\x00]+)/,/^(?:#\*[\s\S]+?\*#)/,/^(?:#\[\[[\s\S]+?\]\]#)/,/^(?:##[^\n]+)/,/^(?:#(?=[a-zA-Z{]))/,/^(?:set[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:if[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:elseif[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:else\b)/,/^(?:\{else\})/,/^(?:end\b)/,/^(?:break\b)/,/^(?:foreach[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:noescape(?=[^a-zA-Z0-9_]+))/,/^(?:define[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:macro[ ]*(?=[^a-zA-Z0-9_]+))/,/^(?:in\b)/,/^(?:[%\+\-\*\/])/,/^(?:<=)/,/^(?:>=)/,/^(?:[><])/,/^(?:==)/,/^(?:\|\|)/,/^(?:&&)/,/^(?:!=)/,/^(?:\$!(?=[{a-zA-Z_]))/,/^(?:\$(?=[{a-zA-Z_]))/,/^(?:!)/,/^(?:=)/,/^(?:[ ]+(?=[^,]))/,/^(?:\s+)/,/^(?:\{)/,/^(?:\})/,/^(?::[\s]*)/,/^(?:\{)/,/^(?:\})/,/^(?:\([\s]*(?=[$'"\[\{\-0-9\w()!]))/,/^(?:\))/,/^(?:\[[\s]*(?=[\-$"'0-9{\[\]]+))/,/^(?:\])/,/^(?:\.\.)/,/^(?:\.(?=[a-zA-Z_]))/,/^(?:\.(?=[\d]))/,/^(?:,[ ]*)/,/^(?:"(\\"|[^\"])*")/,/^(?:'(\\'|[^\'])*')/,/^(?:null\b)/,/^(?:false\b)/,/^(?:true\b)/,/^(?:[0-9]+)/,/^(?:[_a-zA-Z][a-zA-Z0-9_\-]*)/,/^(?:[_a-zA-Z][a-zA-Z0-9_\-]*[ ]*(?=\())/,/^(?:#)/,/^(?:.)/,/^(?:\s+)/,/^(?:[\$#])/,/^(?:$)/,/^(?:$)/],
 conditions: {"mu":{"rules":[5,27,28,36,37,38,39,40,41,43,52,54,55,56,58],"inclusive":false},"c":{"rules":[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,38,39,40,41,43,44,45,46,47,48,49,50,51,52],"inclusive":false},"i":{"rules":[18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,33,34,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"inclusive":false},"h":{"rules":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,27,28,29,30,35,38,39,40,41,43,51,53,55,56,58],"inclusive":false},"esc":{"rules":[57],"inclusive":false},"run":{"rules":[27,28,29,31,32,33,34,35,38,39,40,41,43,44,45,46,47,48,49,50,51,52,55,56,58],"inclusive":false},"INITIAL":{"rules":[0,1,2,59],"inclusive":true}}
 });
 return lexer;
diff --git a/src/parse/velocity.yy b/src/parse/velocity.yy
index 3d4c73d..a24a1ca 100644
--- a/src/parse/velocity.yy
+++ b/src/parse/velocity.yy
@@ -18,7 +18,7 @@ root
 statements
   : statement
       { $$ = [$1]; }
-  | statements statement 
+  | statements statement
       { $$ = [].concat($1, $2); }
   ;
 
@@ -36,13 +36,13 @@ statement
   ;
 
 directives
-  : set 
+  : set
       { $$ = $1; }
-  | if 
+  | if
       { $$ = $1; }
   | elseif
       { $$ = $1; }
-  | else 
+  | else
       { $$ = $1; }
   | end
       { $$ = $1; }
@@ -264,43 +264,45 @@ method
 methodbd
   : ID PARENTHESIS params CLOSE_PARENTHESIS
       { $$ = {id: $1, args: $3 }; }
-  | ID PARENTHESIS CLOSE_PARENTHESIS 
+  | ID PARENTHESIS CLOSE_PARENTHESIS
       { $$ = {id: $1, args: false }; }
   ;
 
 params
-  : literals 
+  : literals
       { $$ = [$1]; }
-  | references 
+  | ID
+      { $$ = [ { type: 'runt', value: $1 } ]; }
+  | references
       { $$ = [$1]; }
-  | params COMMA literals 
+  | params COMMA literals
       { $$ = [].concat($1, $3); }
-  | params COMMA references 
+  | params COMMA references
       { $$ = [].concat($1, $3); }
   ;
 
 property
-  : DOT ID 
+  : DOT ID
       { $$ = $2; }
-  | DOT CONTENT 
+  | DOT CONTENT
       { $$ = {type: 'content', value: $1 + $2 }; }
   ;
 
 index
-  : BRACKET literal CLOSE_BRACKET 
-      { $$ = $2; } 
-  | BRACKET references CLOSE_BRACKET 
-      { $$ = $2; } 
-  | BRACKET literal CONTENT 
-      { $$ = {type: "content", value: $1 + $2.value + $3 }; } 
-  | BRACKET CONTENT 
-      { $$ = {type: "content", value: $1 + $2 }; } 
-  | BRACKET CLOSE_BRACKET 
-      { $$ = {type: "content", value: $1 + $2 }; } 
+  : BRACKET literal CLOSE_BRACKET
+      { $$ = $2; }
+  | BRACKET references CLOSE_BRACKET
+      { $$ = $2; }
+  | BRACKET literal CONTENT
+      { $$ = {type: "content", value: $1 + $2.value + $3 }; }
+  | BRACKET CONTENT
+      { $$ = {type: "content", value: $1 + $2 }; }
+  | BRACKET CLOSE_BRACKET
+      { $$ = {type: "content", value: $1 + $2 }; }
   ;
 
 literal
-  : string 
+  : string
       { $$ = $1; }
   | number
       { $$ = $1; }


Test patch:
diff --git a/tests/compile.js b/tests/compile.js
index 1a09958..07805f7 100644
--- a/tests/compile.js
+++ b/tests/compile.js
@@ -66,6 +66,11 @@ describe('Compile', function() {
       assert.equal('My Home Page haha', render(vm, {page: {}}))
     })
 
+    it('runt type support', function() {
+      var vm = '$page.header(page)'
+      assert.equal('$page.header(page)', render(vm, {page: {}}))
+    })
+
     it('size method', function() {
       var vm = '$foo.bar.size()'
       assert.equal('2', render(vm, {foo: {bar: [1, 2]}}))
@@ -78,7 +83,7 @@ describe('Compile', function() {
 
     it('quiet reference', function() {
       var vm = 'my email is $email'
-      var vmquiet = 'my email is $!email'
+      var vmquiet = 'my email is $!email.xxx'
       assert.equal(vm, render(vm))
       assert.equal('my email is ', render(vmquiet))
     })
@@ -748,6 +753,13 @@ describe('Compile', function() {
       var vm = '$foo.setName'
       assert.equal(render(vm, { foo: { setName: "foo" }}).trim(), "foo")
     })
+    it('#54', function() {
+      var vm = '$a.b.c'
+      assert.equal(render(vm, { a: { b: null }}).trim(), "$a.b.c")
+
+      vm = '$a.b.c()'
+      assert.equal(render(vm, { a: { b: null }}).trim(), "$a.b.c()")
+    });
   })
 
   describe('multiline', function() {