resin 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. data/amber/bin/amberc +10 -350
  2. data/amber/js/Benchfib.deploy.js +80 -89
  3. data/amber/js/Benchfib.js +80 -89
  4. data/amber/js/Canvas.deploy.js +558 -545
  5. data/amber/js/Canvas.js +563 -545
  6. data/amber/js/Compiler-AST.deploy.js +431 -243
  7. data/amber/js/Compiler-AST.js +487 -244
  8. data/amber/js/Compiler-Core.deploy.js +201 -1045
  9. data/amber/js/Compiler-Core.js +208 -1207
  10. data/amber/js/Compiler-Exceptions.deploy.js +37 -18
  11. data/amber/js/Compiler-Exceptions.js +42 -18
  12. data/amber/js/Compiler-IR.deploy.js +1071 -774
  13. data/amber/js/Compiler-IR.js +1194 -848
  14. data/amber/js/Compiler-Inlining.deploy.js +395 -373
  15. data/amber/js/Compiler-Inlining.js +395 -373
  16. data/amber/js/Compiler-Interpreter.deploy.js +1202 -0
  17. data/amber/js/Compiler-Interpreter.js +1631 -0
  18. data/amber/js/Compiler-Semantic.deploy.js +695 -600
  19. data/amber/js/Compiler-Semantic.js +721 -611
  20. data/amber/js/Compiler-Tests.deploy.js +699 -376
  21. data/amber/js/Compiler-Tests.js +834 -381
  22. data/amber/js/Compiler.deploy.js +8563 -1805
  23. data/amber/js/Compiler.js +11476 -2633
  24. data/amber/js/Examples.deploy.js +29 -29
  25. data/amber/js/Examples.js +29 -29
  26. data/amber/js/IDE.deploy.js +3292 -2649
  27. data/amber/js/IDE.js +3318 -2710
  28. data/amber/js/Importer-Exporter.deploy.js +393 -349
  29. data/amber/js/Importer-Exporter.js +398 -354
  30. data/amber/js/Kernel-Announcements.deploy.js +53 -44
  31. data/amber/js/Kernel-Announcements.js +55 -44
  32. data/amber/js/Kernel-Classes.deploy.js +566 -368
  33. data/amber/js/Kernel-Classes.js +660 -402
  34. data/amber/js/Kernel-Collections.deploy.js +1149 -1098
  35. data/amber/js/Kernel-Collections.js +1183 -1116
  36. data/amber/js/Kernel-Exceptions.deploy.js +173 -75
  37. data/amber/js/Kernel-Exceptions.js +215 -77
  38. data/amber/js/Kernel-Methods.deploy.js +530 -313
  39. data/amber/js/Kernel-Methods.js +632 -338
  40. data/amber/js/Kernel-Objects.deploy.js +1734 -1577
  41. data/amber/js/Kernel-Objects.js +1867 -1654
  42. data/amber/js/Kernel-Tests.deploy.js +1416 -973
  43. data/amber/js/Kernel-Tests.js +1495 -981
  44. data/amber/js/Kernel-Transcript.deploy.js +23 -24
  45. data/amber/js/Kernel-Transcript.js +25 -26
  46. data/amber/js/SUnit-Tests.deploy.js +402 -0
  47. data/amber/js/SUnit-Tests.js +518 -0
  48. data/amber/js/SUnit.deploy.js +535 -237
  49. data/amber/js/SUnit.js +634 -246
  50. data/amber/js/amber.js +90 -53
  51. data/amber/js/boot.js +441 -255
  52. data/amber/js/init.js +1 -3
  53. data/amber/js/lib/CodeMirror/codemirror.css +3 -0
  54. data/amber/js/lib/CodeMirror/codemirror.js +104 -55
  55. data/amber/js/lib/peg-0.7.0.min.js +9 -0
  56. data/amber/js/parser.js +1504 -802
  57. data/amber/js/parser.pegjs +170 -165
  58. data/amber/st/Canvas.st +6 -0
  59. data/amber/st/Compiler-AST.st +54 -3
  60. data/amber/st/Compiler-Core.st +6 -551
  61. data/amber/st/Compiler-Exceptions.st +4 -0
  62. data/amber/st/Compiler-IR.st +205 -87
  63. data/amber/st/Compiler-Interpreter.st +597 -0
  64. data/amber/st/Compiler-Semantic.st +46 -21
  65. data/amber/st/Compiler-Tests.st +254 -7
  66. data/amber/st/Compiler.st +3172 -1541
  67. data/amber/st/IDE.st +57 -93
  68. data/amber/st/Importer-Exporter.st +4 -7
  69. data/amber/st/Kernel-Announcements.st +8 -0
  70. data/amber/st/Kernel-Classes.st +149 -40
  71. data/amber/st/Kernel-Collections.st +43 -32
  72. data/amber/st/Kernel-Exceptions.st +70 -1
  73. data/amber/st/Kernel-Methods.st +165 -27
  74. data/amber/st/Kernel-Objects.st +215 -140
  75. data/amber/st/Kernel-Tests.st +195 -10
  76. data/amber/st/Kernel-Transcript.st +1 -3
  77. data/amber/st/SUnit-Tests.st +186 -0
  78. data/amber/st/SUnit.st +186 -14
  79. data/bin/resin +6 -0
  80. data/lib/resin/cli.rb +19 -0
  81. metadata +41 -25
  82. data/amber/js/lib/peg-0.6.2.min.js +0 -2
  83. data/bin/resin-compile +0 -6
  84. data/bin/runresin +0 -12
@@ -0,0 +1,9 @@
1
+ /*
2
+ * PEG.js 0.7.0
3
+ *
4
+ * http://pegjs.majda.cz/
5
+ *
6
+ * Copyright (c) 2010-2012 David Majda
7
+ * Licensend under the MIT license.
8
+ */var PEG=function(undefined){function range(a,b){b===undefined&&(b=a,a=0);var c=new Array(Math.max(0,b-a));for(var d=0,e=a;e<b;d++,e++)c[d]=e;return c}function find(a,b){var c=a.length;for(var d=0;d<c;d++)if(b(a[d]))return a[d]}function contains(a,b){var c=a.length;for(var d=0;d<c;d++)if(a[d]===b)return!0;return!1}function each(a,b){var c=a.length;for(var d=0;d<c;d++)b(a[d],d)}function map(a,b){var c=[],d=a.length;for(var e=0;e<d;e++)c[e]=b(a[e],e);return c}function pluck(a,b){return map(a,function(a){return a[b]})}function keys(a){var b=[];for(var c in a)b.push(c);return b}function values(a){var b=[];for(var c in a)b.push(a[c]);return b}function padLeft(a,b,c){var d=a,e=c-a.length;for(var f=0;f<e;f++)d=b+d;return d}function escape(a){var b=a.charCodeAt(0),c,d;return b<=255?(c="x",d=2):(c="u",d=4),"\\"+c+padLeft(b.toString(16).toUpperCase(),"0",d)}function quote(a){return'"'+a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g,escape)+'"'}function quoteForRegexpClass(a){return a.replace(/\\/g,"\\\\").replace(/\//g,"\\/").replace(/\]/g,"\\]").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\v/g,"\\x0B").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x01-\x08\x0E-\x1F\x80-\uFFFF]/g,escape)}function buildNodeVisitor(a){return function(b){return a[b.type].apply(null,arguments)}}function findRuleByName(a,b){return find(a.rules,function(a){return a.name===b})}var PEG={VERSION:"0.7.0",buildParser:function(a,b){return PEG.compiler.compile(PEG.parser.parse(a),b)}};return PEG.GrammarError=function(a){this.name="PEG.GrammarError",this.message=a},PEG.GrammarError.prototype=Error.prototype,PEG.parser=function(){function a(a){return'"'+a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g,escape)+'"'}var b={parse:function(b,c){function i(a,b,c){var d=a,e=c-a.length;for(var f=0;f<e;f++)d=b+d;return d}function j(a){var b=a.charCodeAt(0),c,d;return b<=255?(c="x",d=2):(c="u",d=4),"\\"+c+i(b.toString(16).toUpperCase(),"0",d)}function k(a){if(e<g)return;e>g&&(g=e,h=[]),h.push(a)}function l(){var a,b,c,d,f,g;f=e,g=e,a=bg();if(a!==null){b=m(),b=b!==null?b:"";if(b!==null){d=n();if(d!==null){c=[];while(d!==null)c.push(d),d=n()}else c=null;c!==null?a=[a,b,c]:(a=null,e=g)}else a=null,e=g}else a=null,e=g;return a!==null&&(a=function(a,b,c){return{type:"grammar",initializer:b!==""?b:null,rules:c,startRule:c[0].name}}(f,a[1],a[2])),a===null&&(e=f),a}function m(){var a,b,c,d;return c=e,d=e,a=u(),a!==null?(b=A(),b=b!==null?b:"",b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return{type:"initializer",code:b}}(c,a[0])),a===null&&(e=c),a}function n(){var a,b,c,d,f,g,h;return g=e,h=e,a=K(),a!==null?(b=M(),b=b!==null?b:"",b!==null?(c=y(),c!==null?(d=o(),d!==null?(f=A(),f=f!==null?f:"",f!==null?a=[a,b,c,d,f]:(a=null,e=h)):(a=null,e=h)):(a=null,e=h)):(a=null,e=h)):(a=null,e=h),a!==null&&(a=function(a,b,c,d){return{type:"rule",name:b,displayName:c!==""?c:null,expression:d}}(g,a[0],a[1],a[3])),a===null&&(e=g),a}function o(){var a,b,c,d,f,g,h;f=e,g=e,a=p();if(a!==null){b=[],h=e,c=B(),c!==null?(d=p(),d!==null?c=[c,d]:(c=null,e=h)):(c=null,e=h);while(c!==null)b.push(c),h=e,c=B(),c!==null?(d=p(),d!==null?c=[c,d]:(c=null,e=h)):(c=null,e=h);b!==null?a=[a,b]:(a=null,e=g)}else a=null,e=g;return a!==null&&(a=function(a,b,c){if(c.length>0){var d=[b].concat(map(c,function(a){return a[1]}));return{type:"choice",alternatives:d}}return b}(f,a[0],a[1])),a===null&&(e=f),a}function p(){var a,b,c,d;c=e,d=e,a=[],b=q();while(b!==null)a.push(b),b=q();a!==null?(b=u(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b,c){var d=b.length!==1?{type:"sequence",elements:b}:b[0];return{type:"action",expression:d,code:c}}(c,a[0],a[1])),a===null&&(e=c);if(a===null){c=e,a=[],b=q();while(b!==null)a.push(b),b=q();a!==null&&(a=function(a,b){return b.length!==1?{type:"sequence",elements:b}:b[0]}(c,a)),a===null&&(e=c)}return a}function q(){var a,b,c,d,f;return d=e,f=e,a=K(),a!==null?(b=z(),b!==null?(c=r(),c!==null?a=[a,b,c]:(a=null,e=f)):(a=null,e=f)):(a=null,e=f),a!==null&&(a=function(a,b,c){return{type:"labeled",label:b,expression:c}}(d,a[0],a[2])),a===null&&(e=d),a===null&&(a=r()),a}function r(){var a,b,c,d;return c=e,d=e,a=C(),a!==null?(b=u(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return{type:"semantic_and",code:b}}(c,a[1])),a===null&&(e=c),a===null&&(c=e,d=e,a=C(),a!==null?(b=s(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return{type:"simple_and",expression:b}}(c,a[1])),a===null&&(e=c),a===null&&(c=e,d=e,a=D(),a!==null?(b=u(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return{type:"semantic_not",code:b}}(c,a[1])),a===null&&(e=c),a===null&&(c=e,d=e,a=D(),a!==null?(b=s(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return{type:"simple_not",expression:b}}(c,a[1])),a===null&&(e=c),a===null&&(a=s())))),a}function s(){var a,b,c,d;return c=e,d=e,a=t(),a!==null?(b=E(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return{type:"optional",expression:b}}(c,a[0])),a===null&&(e=c),a===null&&(c=e,d=e,a=t(),a!==null?(b=F(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return{type:"zero_or_more",expression:b}}(c,a[0])),a===null&&(e=c),a===null&&(c=e,d=e,a=t(),a!==null?(b=G(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return{type:"one_or_more",expression:b}}(c,a[0])),a===null&&(e=c),a===null&&(a=t()))),a}function t(){var a,b,c,d,g,h,i;return d=e,g=e,a=K(),a!==null?(h=e,f++,i=e,b=M(),b=b!==null?b:"",b!==null?(c=y(),c!==null?b=[b,c]:(b=null,e=i)):(b=null,e=i),f--,b===null?b="":(b=null,e=h),b!==null?a=[a,b]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a,b){return{type:"rule_ref",name:b}}(d,a[0])),a===null&&(e=d),a===null&&(a=L(),a===null&&(d=e,a=J(),a!==null&&(a=function(a){return{type:"any"}}(d)),a===null&&(e=d),a===null&&(a=T(),a===null&&(d=e,g=e,a=H(),a!==null?(b=o(),b!==null?(c=I(),c!==null?a=[a,b,c]:(a=null,e=g)):(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a,b){return b}(d,a[1])),a===null&&(e=d))))),a}function u(){var a,b,c,d;return f++,c=e,d=e,a=v(),a!==null?(b=bg(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return b.substr(1,b.length-2)}(c,a[0])),a===null&&(e=c),f--,f===0&&a===null&&k("action"),a}function v(){var a,c,d,g,h;g=e,h=e,b.charCodeAt(e)===123?(a="{",e++):(a=null,f===0&&k('"{"'));if(a!==null){c=[],d=v(),d===null&&(d=x());while(d!==null)c.push(d),d=v(),d===null&&(d=x());c!==null?(b.charCodeAt(e)===125?(d="}",e++):(d=null,f===0&&k('"}"')),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h;return a!==null&&(a=function(a,b){return"{"+b.join("")+"}"}(g,a[1])),a===null&&(e=g),a}function w(){var a,b,c;c=e,b=x();if(b!==null){a=[];while(b!==null)a.push(b),b=x()}else a=null;return a!==null&&(a=function(a,b){return b.join("")}(c,a)),a===null&&(e=c),a}function x(){var a;return/^[^{}]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[^{}]")),a}function y(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===61?(a="=",e++):(a=null,f===0&&k('"="')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"="}(d)),a===null&&(e=d),a}function z(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===58?(a=":",e++):(a=null,f===0&&k('":"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return":"}(d)),a===null&&(e=d),a}function A(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===59?(a=";",e++):(a=null,f===0&&k('";"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return";"}(d)),a===null&&(e=d),a}function B(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===47?(a="/",e++):(a=null,f===0&&k('"/"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"/"}(d)),a===null&&(e=d),a}function C(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===38?(a="&",e++):(a=null,f===0&&k('"&"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"&"}(d)),a===null&&(e=d),a}function D(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===33?(a="!",e++):(a=null,f===0&&k('"!"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"!"}(d)),a===null&&(e=d),a}function E(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===63?(a="?",e++):(a=null,f===0&&k('"?"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"?"}(d)),a===null&&(e=d),a}function F(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===42?(a="*",e++):(a=null,f===0&&k('"*"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"*"}(d)),a===null&&(e=d),a}function G(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===43?(a="+",e++):(a=null,f===0&&k('"+"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"+"}(d)),a===null&&(e=d),a}function H(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===40?(a="(",e++):(a=null,f===0&&k('"("')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"("}(d)),a===null&&(e=d),a}function I(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===41?(a=")",e++):(a=null,f===0&&k('")"')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return")"}(d)),a===null&&(e=d),a}function J(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===46?(a=".",e++):(a=null,f===0&&k('"."')),a!==null?(c=bg(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"."}(d)),a===null&&(e=d),a}function K(){var a,c,d,g,h;f++,g=e,h=e,a=bd(),a===null&&(b.charCodeAt(e)===95?(a="_",e++):(a=null,f===0&&k('"_"')),a===null&&(b.charCodeAt(e)===36?(a="$",e++):(a=null,f===0&&k('"$"'))));if(a!==null){c=[],d=bd(),d===null&&(d=bb(),d===null&&(b.charCodeAt(e)===95?(d="_",e++):(d=null,f===0&&k('"_"')),d===null&&(b.charCodeAt(e)===36?(d="$",e++):(d=null,f===0&&k('"$"')))));while(d!==null)c.push(d),d=bd(),d===null&&(d=bb(),d===null&&(b.charCodeAt(e)===95?(d="_",e++):(d=null,f===0&&k('"_"')),d===null&&(b.charCodeAt(e)===36?(d="$",e++):(d=null,f===0&&k('"$"')))));c!==null?(d=bg(),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h;return a!==null&&(a=function(a,b,c){return b+c.join("")}(g,a[0],a[1])),a===null&&(e=g),f--,f===0&&a===null&&k("identifier"),a}function L(){var a,c,d,g,h;return f++,g=e,h=e,a=N(),a===null&&(a=Q()),a!==null?(b.charCodeAt(e)===105?(c="i",e++):(c=null,f===0&&k('"i"')),c=c!==null?c:"",c!==null?(d=bg(),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)):(a=null,e=h),a!==null&&(a=function(a,b,c){return{type:"literal",value:b,ignoreCase:c==="i"}}(g,a[0],a[1])),a===null&&(e=g),f--,f===0&&a===null&&k("literal"),a}function M(){var a,b,c,d;return f++,c=e,d=e,a=N(),a===null&&(a=Q()),a!==null?(b=bg(),b!==null?a=[a,b]:(a=null,e=d)):(a=null,e=d),a!==null&&(a=function(a,b){return b}(c,a[0])),a===null&&(e=c),f--,f===0&&a===null&&k("string"),a}function N(){var a,c,d,g,h;g=e,h=e,b.charCodeAt(e)===34?(a='"',e++):(a=null,f===0&&k('"\\""'));if(a!==null){c=[],d=O();while(d!==null)c.push(d),d=O();c!==null?(b.charCodeAt(e)===34?(d='"',e++):(d=null,f===0&&k('"\\""')),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h;return a!==null&&(a=function(a,b){return b.join("")}(g,a[1])),a===null&&(e=g),a}function O(){var a;return a=P(),a===null&&(a=Y(),a===null&&(a=Z(),a===null&&(a=$(),a===null&&(a=_(),a===null&&(a=ba()))))),a}function P(){var a,c,d,g,h;return d=e,g=e,h=e,f++,b.charCodeAt(e)===34?(a='"',e++):(a=null,f===0&&k('"\\""')),a===null&&(b.charCodeAt(e)===92?(a="\\",e++):(a=null,f===0&&k('"\\\\"')),a===null&&(a=bl())),f--,a===null?a="":(a=null,e=h),a!==null?(b.length>e?(c=b.charAt(e),e++):(c=null,f===0&&k("any character")),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a,b){return b}(d,a[1])),a===null&&(e=d),a}function Q(){var a,c,d,g,h;g=e,h=e,b.charCodeAt(e)===39?(a="'",e++):(a=null,f===0&&k('"\'"'));if(a!==null){c=[],d=R();while(d!==null)c.push(d),d=R();c!==null?(b.charCodeAt(e)===39?(d="'",e++):(d=null,f===0&&k('"\'"')),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h;return a!==null&&(a=function(a,b){return b.join("")}(g,a[1])),a===null&&(e=g),a}function R(){var a;return a=S(),a===null&&(a=Y(),a===null&&(a=Z(),a===null&&(a=$(),a===null&&(a=_(),a===null&&(a=ba()))))),a}function S(){var a,c,d,g,h;return d=e,g=e,h=e,f++,b.charCodeAt(e)===39?(a="'",e++):(a=null,f===0&&k('"\'"')),a===null&&(b.charCodeAt(e)===92?(a="\\",e++):(a=null,f===0&&k('"\\\\"')),a===null&&(a=bl())),f--,a===null?a="":(a=null,e=h),a!==null?(b.length>e?(c=b.charAt(e),e++):(c=null,f===0&&k("any character")),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a,b){return b}(d,a[1])),a===null&&(e=d),a}function T(){var a,c,d,g,h,i,j,l;f++,j=e,l=e,b.charCodeAt(e)===91?(a="[",e++):(a=null,f===0&&k('"["'));if(a!==null){b.charCodeAt(e)===94?(c="^",e++):(c=null,f===0&&k('"^"')),c=c!==null?c:"";if(c!==null){d=[],g=U(),g===null&&(g=V());while(g!==null)d.push(g),g=U(),g===null&&(g=V());d!==null?(b.charCodeAt(e)===93?(g="]",e++):(g=null,f===0&&k('"]"')),g!==null?(b.charCodeAt(e)===105?(h="i",e++):(h=null,f===0&&k('"i"')),h=h!==null?h:"",h!==null?(i=bg(),i!==null?a=[a,c,d,g,h,i]:(a=null,e=l)):(a=null,e=l)):(a=null,e=l)):(a=null,e=l)}else a=null,e=l}else a=null,e=l;return a!==null&&(a=function(a,b,c,d){var e=map(c,function(a){return a.data}),f="["+b+map(c,function(a){return a.rawText}).join("")+"]"+d;return{type:"class",inverted:b==="^",ignoreCase:d==="i",parts:e,rawText:f}}(j,a[1],a[2],a[4])),a===null&&(e=j),f--,f===0&&a===null&&k("character class"),a}function U(){var a,c,d,g,h;return g=e,h=e,a=V(),a!==null?(b.charCodeAt(e)===45?(c="-",e++):(c=null,f===0&&k('"-"')),c!==null?(d=V(),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)):(a=null,e=h),a!==null&&(a=function(a,b,c){if(b.data.charCodeAt(0)>c.data.charCodeAt(0))throw new this.SyntaxError("Invalid character range: "+b.rawText+"-"+c.rawText+".");return{data:[b.data,c.data],rawText:b.rawText+"-"+c.rawText}}(g,a[0],a[2])),a===null&&(e=g),a}function V(){var a,b;return b=e,a=W(),a!==null&&(a=function(a,b){return{data:b,rawText:quoteForRegexpClass(b)}}(b,a)),a===null&&(e=b),a}function W(){var a;return a=X(),a===null&&(a=Y(),a===null&&(a=Z(),a===null&&(a=$(),a===null&&(a=_(),a===null&&(a=ba()))))),a}function X(){var a,c,d,g,h;return d=e,g=e,h=e,f++,b.charCodeAt(e)===93?(a="]",e++):(a=null,f===0&&k('"]"')),a===null&&(b.charCodeAt(e)===92?(a="\\",e++):(a=null,f===0&&k('"\\\\"')),a===null&&(a=bl())),f--,a===null?a="":(a=null,e=h),a!==null?(b.length>e?(c=b.charAt(e),e++):(c=null,f===0&&k("any character")),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a,b){return b}(d,a[1])),a===null&&(e=d),a}function Y(){var a,c,d,g,h,i;return g=e,h=e,b.charCodeAt(e)===92?(a="\\",e++):(a=null,f===0&&k('"\\\\"')),a!==null?(i=e,f++,c=bb(),c===null&&(b.charCodeAt(e)===120?(c="x",e++):(c=null,f===0&&k('"x"')),c===null&&(b.charCodeAt(e)===117?(c="u",e++):(c=null,f===0&&k('"u"')),c===null&&(c=bl()))),f--,c===null?c="":(c=null,e=i),c!==null?(b.length>e?(d=b.charAt(e),e++):(d=null,f===0&&k("any character")),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)):(a=null,e=h),a!==null&&(a=function(a,b){return b.replace("b","\b").replace("f","\f").replace("n","\n").replace("r","\r").replace("t","\t").replace("v"," ")}(g,a[2])),a===null&&(e=g),a}function Z(){var a,c,d,g,h;return d=e,g=e,b.substr(e,2)==="\\0"?(a="\\0",e+=2):(a=null,f===0&&k('"\\\\0"')),a!==null?(h=e,f++,c=bb(),f--,c===null?c="":(c=null,e=h),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a){return"\0"}(d)),a===null&&(e=d),a}function $(){var a,c,d,g,h;return g=e,h=e,b.substr(e,2)==="\\x"?(a="\\x",e+=2):(a=null,f===0&&k('"\\\\x"')),a!==null?(c=bc(),c!==null?(d=bc(),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)):(a=null,e=h),a!==null&&(a=function(a,b,c){return String.fromCharCode(parseInt(b+c,16))}(g,a[1],a[2])),a===null&&(e=g),a}function _(){var a,c,d,g,h,i,j;return i=e,j=e,b.substr(e,2)==="\\u"?(a="\\u",e+=2):(a=null,f===0&&k('"\\\\u"')),a!==null?(c=bc(),c!==null?(d=bc(),d!==null?(g=bc(),g!==null?(h=bc(),h!==null?a=[a,c,d,g,h]:(a=null,e=j)):(a=null,e=j)):(a=null,e=j)):(a=null,e=j)):(a=null,e=j),a!==null&&(a=function(a,b,c,d,e){return String.fromCharCode(parseInt(b+c+d+e,16))}(i,a[1],a[2],a[3],a[4])),a===null&&(e=i),a}function ba(){var a,c,d,g;return d=e,g=e,b.charCodeAt(e)===92?(a="\\",e++):(a=null,f===0&&k('"\\\\"')),a!==null?(c=bk(),c!==null?a=[a,c]:(a=null,e=g)):(a=null,e=g),a!==null&&(a=function(a,b){return b}(d,a[1])),a===null&&(e=d),a}function bb(){var a;return/^[0-9]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[0-9]")),a}function bc(){var a;return/^[0-9a-fA-F]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[0-9a-fA-F]")),a}function bd(){var a;return a=be(),a===null&&(a=bf()),a}function be(){var a;return/^[a-z]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[a-z]")),a}function bf(){var a;return/^[A-Z]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[A-Z]")),a}function bg(){var a,b;a=[],b=bm(),b===null&&(b=bk(),b===null&&(b=bh()));while(b!==null)a.push(b),b=bm(),b===null&&(b=bk(),b===null&&(b=bh()));return a}function bh(){var a;return f++,a=bi(),a===null&&(a=bj()),f--,f===0&&a===null&&k("comment"),a}function bi(){var a,c,d,g,h,i,j;h=e,b.substr(e,2)==="//"?(a="//",e+=2):(a=null,f===0&&k('"//"'));if(a!==null){c=[],i=e,j=e,f++,d=bl(),f--,d===null?d="":(d=null,e=j),d!==null?(b.length>e?(g=b.charAt(e),e++):(g=null,f===0&&k("any character")),g!==null?d=[d,g]:(d=null,e=i)):(d=null,e=i);while(d!==null)c.push(d),i=e,j=e,f++,d=bl(),f--,d===null?d="":(d=null,e=j),d!==null?(b.length>e?(g=b.charAt(e),e++):(g=null,f===0&&k("any character")),g!==null?d=[d,g]:(d=null,e=i)):(d=null,e=i);c!==null?a=[a,c]:(a=null,e=h)}else a=null,e=h;return a}function bj(){var a,c,d,g,h,i,j;h=e,b.substr(e,2)==="/*"?(a="/*",e+=2):(a=null,f===0&&k('"/*"'));if(a!==null){c=[],i=e,j=e,f++,b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),f--,d===null?d="":(d=null,e=j),d!==null?(b.length>e?(g=b.charAt(e),e++):(g=null,f===0&&k("any character")),g!==null?d=[d,g]:(d=null,e=i)):(d=null,e=i);while(d!==null)c.push(d),i=e,j=e,f++,b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),f--,d===null?d="":(d=null,e=j),d!==null?(b.length>e?(g=b.charAt(e),e++):(g=null,f===0&&k("any character")),g!==null?d=[d,g]:(d=null,e=i)):(d=null,e=i);c!==null?(b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h;return a}function bk(){var a;return f++,b.charCodeAt(e)===10?(a="\n",e++):(a=null,f===0&&k('"\\n"')),a===null&&(b.substr(e,2)==="\r\n"?(a="\r\n",e+=2):(a=null,f===0&&k('"\\r\\n"')),a===null&&(b.charCodeAt(e)===13?(a="\r",e++):(a=null,f===0&&k('"\\r"')),a===null&&(b.charCodeAt(e)===8232?(a="\u2028",e++):(a=null,f===0&&k('"\\u2028"')),a===null&&(b.charCodeAt(e)===8233?(a="\u2029",e++):(a=null,f===0&&k('"\\u2029"')))))),f--,f===0&&a===null&&k("end of line"),a}function bl(){var a;return/^[\n\r\u2028\u2029]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[\\n\\r\\u2028\\u2029]")),a}function bm(){var a;return f++,/^[ \t\x0B\f\xA0\uFEFF\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[ \\t\\x0B\\f\\xA0\\uFEFF\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]")),f--,f===0&&a===null&&k("whitespace"),a}function bn(a){a.sort();var b=null,c=[];for(var d=0;d<a.length;d++)a[d]!==b&&(c.push(a[d]),b=a[d]);return c}function bo(){var a=1,c=1,d=!1;for(var f=0;f<Math.max(e,g);f++){var h=b.charAt(f);h==="\n"?(d||a++,c=1,d=!1):h==="\r"||h==="\u2028"||h==="\u2029"?(a++,c=1,d=!0):(c++,d=!1)}return{line:a,column:c}}var d={grammar:l,initializer:m,rule:n,choice:o,sequence:p,labeled:q,prefixed:r,suffixed:s,primary:t,action:u,braced:v,nonBraceCharacters:w,nonBraceCharacter:x,equals:y,colon:z,semicolon:A,slash:B,and:C,not:D,question:E,star:F,plus:G,lparen:H,rparen:I,dot:J,identifier:K,literal:L,string:M,doubleQuotedString:N,doubleQuotedCharacter:O,simpleDoubleQuotedCharacter:P,singleQuotedString:Q,singleQuotedCharacter:R,simpleSingleQuotedCharacter:S,"class":T,classCharacterRange:U,classCharacter:V,bracketDelimitedCharacter:W,simpleBracketDelimitedCharacter:X,simpleEscapeSequence:Y,zeroEscapeSequence:Z,hexEscapeSequence:$,unicodeEscapeSequence:_,eolEscapeSequence:ba,digit:bb,hexDigit:bc,letter:bd,lowerCaseLetter:be,upperCaseLetter:bf,__:bg,comment:bh,singleLineComment:bi,multiLineComment:bj,eol:bk,eolChar:bl,whitespace:bm};if(c!==undefined){if(d[c]===undefined)throw new Error("Invalid rule name: "+a(c)+".")}else c="grammar";var e=0,f=0,g=0,h=[],bp=d[c]();if(bp===null||e!==b.length){var bq=Math.max(e,g),br=bq<b.length?b.charAt(bq):null,bs=bo();throw new this.SyntaxError(bn(h),br,bq,bs.line,bs.column)}return bp},toSource:function(){return this._source}};return b.SyntaxError=function(b,c,d,e,f){function g(b,c){var d,e;switch(b.length){case 0:d="end of input";break;case 1:d=b[0];break;default:d=b.slice(0,b.length-1).join(", ")+" or "+b[b.length-1]}return e=c?a(c):"end of input","Expected "+d+" but "+e+" found."}this.name="SyntaxError",this.expected=b,this.found=c,this.message=g(b,c),this.offset=d,this.line=e,this.column=f},b.SyntaxError.prototype=Error.prototype,b}(),PEG.compiler={appliedPassNames:["reportMissingRules","reportLeftRecursion","removeProxyRules","computeVarNames","computeParams"],compile:function(ast,options){var that=this;each(this.appliedPassNames,function(a){that.passes[a](ast)});var source=this.emitter(ast,options),result=eval(source);return result._source=source,result}},PEG.compiler.passes={reportMissingRules:function(a){function b(){}function c(a){e(a.expression)}function d(a){return function(b){each(b[a],e)}}var e=buildNodeVisitor({grammar:d("rules"),rule:c,choice:d("alternatives"),sequence:d("elements"),labeled:c,simple_and:c,simple_not:c,semantic_and:b,semantic_not:b,optional:c,zero_or_more:c,one_or_more:c,action:c,rule_ref:function(b){if(!findRuleByName(a,b.name))throw new PEG.GrammarError('Referenced rule "'+b.name+'" does not exist.')},literal:b,any:b,"class":b});e(a)},reportLeftRecursion:function(a){function b(){}function c(a,b){e(a.expression,b)}function d(a){return function(b,c){each(b[a],function(a){e(a,c)})}}var e=buildNodeVisitor({grammar:d("rules"),rule:function(a,b){e(a.expression,b.concat(a.name))},choice:d("alternatives"),sequence:function(a,b){a.elements.length>0&&e(a.elements[0],b)},labeled:c,simple_and:c,simple_not:c,semantic_and:b,semantic_not:b,optional:c,zero_or_more:c,one_or_more:c,action:c,rule_ref:function(b,c){if(contains(c,b.name))throw new PEG.GrammarError('Left recursion detected for rule "'+b.name+'".');e(findRuleByName(a,b.name),c)},literal:b,any:b,"class":b});e(a,[])},removeProxyRules:function(a){function b(a){return a.type==="rule"&&a.expression.type==="rule_ref"}function c(a,b,c){function d(){}function e(a,b,c){g(a.expression,b,c)}function f(a){return function(b,c,d){each(b[a],function(a){g(a,c,d)})}}var g=buildNodeVisitor({grammar:f("rules"),rule:e,choice:f("alternatives"),sequence:f("elements"),labeled:e,simple_and:e,simple_not:e,semantic_and:d,semantic_not:d,optional:e,zero_or_more:e,one_or_more:e,action:e,rule_ref:function(a,b,c){a.name===b&&(a.name=c)},literal:d,any:d,"class":d});g(a,b,c)}var d=[];each(a.rules,function(e,f){b(e)&&(c(a,e.name,e.expression.name),e.name===a.startRule&&(a.startRule=e.expression.name),d.push(f))}),d.reverse(),each(d,function(b){a.rules.splice(b,1)})},computeVarNames:function(a){function b(a){return"result"+a}function c(a){return"pos"+a}function d(a,c){return a.resultVar=b(c.result),{result:0,pos:0}}function e(a){return function(d,e){var g=f(d.expression,{result:e.result+a.result,pos:e.pos+a.pos});return d.resultVar=b(e.result),a.pos!==0&&(d.posVar=c(e.pos)),{result:g.result+a.result,pos:g.pos+a.pos}}}var f=buildNodeVisitor({grammar:function(a,b){each(a.rules,function(a){f(a,b)})},rule:function(a,d){var e=f(a.expression,d);a.resultVar=b(d.result),a.resultVars=map(range(e.result+1),b),a.posVars=map(range(e.pos),c)},choice:function(a,c){var d=map(a.alternatives,function(a){return f(a,c)});return a.resultVar=b(c.result),{result:Math.max.apply(null,pluck(d,"result")),pos:Math.max.apply(null,pluck(d,"pos"))}},sequence:function(a,d){var e=map(a.elements,function(a,b){return f(a,{result:d.result+b,pos:d.pos+1})});return a.resultVar=b(d.result),a.posVar=c(d.pos),{result:a.elements.length>0?Math.max.apply(null,map(e,function(a,b){return b+a.result})):0,pos:a.elements.length>0?1+Math.max.apply(null,pluck(e,"pos")):1}},labeled:e({result:0,pos:0}),simple_and:e({result:0,pos:1}),simple_not:e({result:0,pos:1}),semantic_and:d,semantic_not:d,optional:e({result:0,pos:0}),zero_or_more:e({result:1,pos:0}),one_or_more:e({result:1,pos:0}),action:e({result:0,pos:1}),rule_ref:d,literal:d,any:d,"class":d});f(a,{result:0,pos:0})},computeParams:function(a){function c(a){b.push({}),a(),b.pop()}function d(){}function e(a){c(function(){g(a.expression)})}function f(a){var c=b[b.length-1],d={},e;for(e in c)d[e]=c[e];a.params=d}var b=[],g=buildNodeVisitor({grammar:function(a){each(a.rules,g)},rule:e,choice:function(a){c(function(){each(a.alternatives,g)})},sequence:function(a){function e(b){each(pluck(a.elements,"resultVar"),function(d,e){(new RegExp("^"+d+"(\\[\\d+\\])*$")).test(c[b])&&(c[b]=a.resultVar+"["+e+"]"+c[b].substr(d.length))})}var c=b[b.length-1],d;each(a.elements,g);for(d in c)e(d)},labeled:function(a){b[b.length-1][a.label]=a.resultVar,c(function(){g(a.expression)})},simple_and:e,simple_not:e,semantic_and:f,semantic_not:f,optional:e,zero_or_more:e,one_or_more:e,action:function(a){c(function(){g(a.expression),f(a)})},rule_ref:d,literal:d,any:d,"class":d});g(a)}},PEG.compiler.emitter=function(a,b){function e(a,c){return c.string=quote,c.pluck=pluck,c.keys=keys,c.values=values,c.emit=g,c.options=b,b.trackLineAndColumn?(c.posInit=function(a){return"var "+a+" = "+"{ offset: 0, line: 1, column: 1, seenCR: false }"},c.posClone=function(a){return"clone("+a+")"},c.posOffset=function(a){return a+".offset"},c.posAdvance=function(a){return"advance(pos, "+a+")"}):(c.posInit=function(a){return"var "+a+" = 0"},c.posClone=function(a){return a},c.posOffset=function(a){return a},c.posAdvance=function(a){return a===1?"pos++":"pos += "+a}),c.posSave=function(a){return a.posVar+" = "+c.posClone("pos")},c.posRestore=function(a){return"pos = "+c.posClone(a.posVar)},d[a](c)}function f(a){return function(b){return e(a,{node:b})}}b=b||{},b.cache===undefined&&(b.cache=!1),b.trackLineAndColumn===undefined&&(b.trackLineAndColumn=!1);var c=function(a){function b(a){function b(a){return a.charCodeAt(0).toString(16).toUpperCase()}return a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E\x0F]/g,function(a){return"\\x0"+b(a)}).replace(/[\x10-\x1F\x80-\xFF]/g,function(a){return"\\x"+b(a)}).replace(/[\u0180-\u0FFF]/g,function(a){return"\\u0"+b(a)}).replace(/[\u1080-\uFFFF]/g,function(a){return"\\u"+b(a)})}function c(a){return"__p.push("+a+");"}function d(a,d,e){function f(a,b,c){return a.replace(new RegExp("^.{"+b+"}","gm"),function(a,b){return b===0?c?"":a:""})}var g=b(f(a.substring(0,d),e.indentLevel(),e.atBOL));return g.length>0?c('"'+g+'"'):""}var e={VERSION:"1.1.0",indentStep:2,commands:{"if":{params:/^(.*)$/,compile:function(a,b,c){return["if("+c[0]+"){",[]]},stackOp:"push"},"else":{params:/^$/,compile:function(a){var b=a.commandStack,c=b[b.length-1]==="else",d=b[b.length-1]==="if";if(c)throw new Error("Multiple #elses.");if(!d)throw new Error("Using #else outside of #if.");return["}else{",[]]},stackOp:"replace"},"for":{params:/^([a-zA-Z_][a-zA-Z0-9_]*)[ \t]+in[ \t]+(.*)$/,init:function(a){a.forCurrLevel=0,a.forMaxLevel=0},compile:function(a,b,c){var d="__c"+a.forCurrLevel,e="__l"+a.forCurrLevel,f="__i"+a.forCurrLevel;return a.forCurrLevel++,a.forMaxLevel<a.forCurrLevel&&(a.forMaxLevel=a.forCurrLevel),[d+"="+c[1]+";"+e+"="+d+".length;"+"for("+f+"=0;"+f+"<"+e+";"+f+"++){"+c[0]+"="+d+"["+f+"];",[c[0],d,e,f]]},exit:function(a){a.forCurrLevel--},stackOp:"push"},end:{params:/^$/,compile:function(a){var b=a.commandStack,c;if(b.length===0)throw new Error("Too many #ends.");return c=e.commands[b[b.length-1]].exit,c&&c(a),["}",[]]},stackOp:"pop"},block:{params:/^(.*)$/,compile:function(a,d,e){var f="__x",g="__n",h="__l",i="__i";return[f+'="'+b(d.substring(a.indentLevel()))+'";'+g+"=("+e[0]+').toString().split("\\n");'+h+"="+g+".length;"+"for("+i+"=0;"+i+"<"+h+";"+i+"++){"+g+"["+i+"]="+f+"+"+g+"["+i+']+"\\n";'+"}"+c(g+'.join("")'),[f,g,h,i]]},stackOp:"nop"}},template:function(b){function g(a,b){return a.atBOL=!1,[c(b),[]]}function h(a,b,c,d){var g,h,i;g=e.commands[c];if(!g)throw new Error("Unknown command: #"+c+".");h=g.params.exec(d);if(h===null)throw new Error("Invalid params for command #"+c+": "+d+".");return i=g.compile(a,b,h.slice(1)),f[g.stackOp](a.commandStack,c),a.atBOL=!0,i}var f={push:function(a,b){a.push(b)},replace:function(a,b){a[a.length-1]=b},pop:function(a){a.pop()},nop:function(){}},i={commandStack:[],atBOL:!0,indentLevel:function(){return e.indentStep*this.commandStack.length}},j="",k=["__p=[]"],l,m,n,o;for(l in e.commands)e.commands[l].init&&e.commands[l].init(i);while((m=/^([ \t]*)#([a-zA-Z_][a-zA-Z0-9_]*)(?:[ \t]+([^ \t\n][^\n]*))?[ \t]*(?:\n|$)|#\{([^}]*)\}/m.exec(b))!==null)j+=d(b,m.index,i),n=m[2]!==a&&m[2]!==""?h(i,m[1],m[2],m[3]||""):g(i,m[4]),j+=n[0],k=k.concat(n[1]),b=b.substring(m.index+m[0].length);j+=d(b,b.length,i);if(i.commandStack.length>0)throw new Error("Missing #end.");k.sort();for(o=0;o<k.length;o++)k[o]===k[o-1]&&k.splice(o--,1);return new Function("__v",["__v=__v||{};","var "+k.join(",")+";","with(__v){",j,'return __p.join("").replace(/^\\n+|\\n+$/g,"");};'].join(""))}};return e}(),d=function(){var a,b={},d={grammar:["(function(){"," /*"," * Generated by PEG.js 0.7.0."," *"," * http://pegjs.majda.cz/"," */"," "," function quote(s) {"," /*"," * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a"," * string literal except for the closing quote character, backslash,"," * carriage return, line separator, paragraph separator, and line feed."," * Any character may appear in the form of an escape sequence."," *"," * For portability, we also escape escape all control and non-ASCII",' * characters. Note that "\\0" and "\\v" escape sequences are not used'," * because JSHint does not like the first and IE the second."," */"," return '\"' + s"," .replace(/\\\\/g, '\\\\\\\\') // backslash"," .replace(/\"/g, '\\\\\"') // closing quote character"," .replace(/\\x08/g, '\\\\b') // backspace"," .replace(/\\t/g, '\\\\t') // horizontal tab"," .replace(/\\n/g, '\\\\n') // line feed"," .replace(/\\f/g, '\\\\f') // form feed"," .replace(/\\r/g, '\\\\r') // carriage return"," .replace(/[\\x00-\\x07\\x0B\\x0E-\\x1F\\x80-\\uFFFF]/g, escape)"," + '\"';"," }"," "," var result = {"," /*"," * Parses the input with a generated parser. If the parsing is successfull,"," * returns a value explicitly or implicitly specified by the grammar from"," * which the parser was generated (see |PEG.buildParser|). If the parsing is"," * unsuccessful, throws |PEG.parser.SyntaxError| describing the error."," */"," parse: function(input, startRule) {"," var parseFunctions = {"," #for rule in node.rules",' #{string(rule.name) + ": parse_" + rule.name + (rule !== node.rules[node.rules.length - 1] ? "," : "")}'," #end"," };"," "," if (startRule !== undefined) {"," if (parseFunctions[startRule] === undefined) {",' throw new Error("Invalid rule name: " + quote(startRule) + ".");'," }"," } else {"," startRule = #{string(node.startRule)};"," }"," ",' #{posInit("pos")};'," var reportFailures = 0;",' #{posInit("rightmostFailuresPos")};'," var rightmostFailuresExpected = [];"," #if options.cache"," var cache = {};"," #end"," "," function padLeft(input, padding, length) {"," var result = input;"," "," var padLength = length - input.length;"
9
+ ," for (var i = 0; i < padLength; i++) {"," result = padding + result;"," }"," "," return result;"," }"," "," function escape(ch) {"," var charCode = ch.charCodeAt(0);"," var escapeChar;"," var length;"," "," if (charCode <= 0xFF) {"," escapeChar = 'x';"," length = 2;"," } else {"," escapeChar = 'u';"," length = 4;"," }"," "," return '\\\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);"," }"," "," #if options.trackLineAndColumn"," function clone(object) {"," var result = {};"," for (var key in object) {"," result[key] = object[key];"," }"," return result;"," }"," "," function advance(pos, n) {"," var endOffset = pos.offset + n;"," "," for (var offset = pos.offset; offset < endOffset; offset++) {"," var ch = input.charAt(offset);",' if (ch === "\\n") {'," if (!pos.seenCR) { pos.line++; }"," pos.column = 1;"," pos.seenCR = false;",' } else if (ch === "\\r" || ch === "\\u2028" || ch === "\\u2029") {'," pos.line++;"," pos.column = 1;"," pos.seenCR = true;"," } else {"," pos.column++;"," pos.seenCR = false;"," }"," }"," "," pos.offset += n;"," }"," "," #end"," function matchFailed(failure) {",' if (#{posOffset("pos")} < #{posOffset("rightmostFailuresPos")}) {'," return;"," }"," ",' if (#{posOffset("pos")} > #{posOffset("rightmostFailuresPos")}) {',' rightmostFailuresPos = #{posClone("pos")};'," rightmostFailuresExpected = [];"," }"," "," rightmostFailuresExpected.push(failure);"," }"," "," #for rule in node.rules"," #block emit(rule)"," "," #end"," "," function cleanupExpected(expected) {"," expected.sort();"," "," var lastExpected = null;"," var cleanExpected = [];"," for (var i = 0; i < expected.length; i++) {"," if (expected[i] !== lastExpected) {"," cleanExpected.push(expected[i]);"," lastExpected = expected[i];"," }"," }"," return cleanExpected;"," }"," "," #if !options.trackLineAndColumn"," function computeErrorPosition() {"," /*"," * The first idea was to use |String.split| to break the input up to the"," * error position along newlines and derive the line and column from"," * there. However IE's |split| implementation is so broken that it was"," * enough to prevent it."," */"," "," var line = 1;"," var column = 1;"," var seenCR = false;"," "," for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) {"," var ch = input.charAt(i);",' if (ch === "\\n") {'," if (!seenCR) { line++; }"," column = 1;"," seenCR = false;",' } else if (ch === "\\r" || ch === "\\u2028" || ch === "\\u2029") {'," line++;"," column = 1;"," seenCR = true;"," } else {"," column++;"," seenCR = false;"," }"," }"," "," return { line: line, column: column };"," }"," #end"," "," #if node.initializer"," #block emit(node.initializer)"," #end"," "," var result = parseFunctions[startRule]();"," "," /*"," * The parser is now in one of the following three states:"," *"," * 1. The parser successfully parsed the whole input."," *"," * - |result !== null|",' * - |#{posOffset("pos")} === input.length|'," * - |rightmostFailuresExpected| may or may not contain something"," *"," * 2. The parser successfully parsed only a part of the input."," *"," * - |result !== null|",' * - |#{posOffset("pos")} < input.length|'," * - |rightmostFailuresExpected| may or may not contain something"," *"," * 3. The parser did not successfully parse any part of the input."," *"," * - |result === null|",' * - |#{posOffset("pos")} === 0|'," * - |rightmostFailuresExpected| contains at least one failure"," *"," * All code following this comment (including called functions) must"," * handle these states."," */",' if (result === null || #{posOffset("pos")} !== input.length) {',' var offset = Math.max(#{posOffset("pos")}, #{posOffset("rightmostFailuresPos")});'," var found = offset < input.length ? input.charAt(offset) : null;"," #if options.trackLineAndColumn",' var errorPosition = #{posOffset("pos")} > #{posOffset("rightmostFailuresPos")} ? pos : rightmostFailuresPos;'," #else"," var errorPosition = computeErrorPosition();"," #end"," "," throw new this.SyntaxError("," cleanupExpected(rightmostFailuresExpected),"," found,"," offset,"," errorPosition.line,"," errorPosition.column"," );"," }"," "," return result;"," },"," "," /* Returns the parser source code. */"," toSource: function() { return this._source; }"," };"," "," /* Thrown when a parser encounters a syntax error. */"," "," result.SyntaxError = function(expected, found, offset, line, column) {"," function buildMessage(expected, found) {"," var expectedHumanized, foundHumanized;"," "," switch (expected.length) {"," case 0:",' expectedHumanized = "end of input";'," break;"," case 1:"," expectedHumanized = expected[0];"," break;"," default:",' expectedHumanized = expected.slice(0, expected.length - 1).join(", ")',' + " or "'," + expected[expected.length - 1];"," }"," ",' foundHumanized = found ? quote(found) : "end of input";'," ",' return "Expected " + expectedHumanized + " but " + foundHumanized + " found.";'," }"," ",' this.name = "SyntaxError";'," this.expected = expected;"," this.found = found;"," this.message = buildMessage(expected, found);"," this.offset = offset;"," this.line = line;"," this.column = column;"," };"," "," result.SyntaxError.prototype = Error.prototype;"," "," return result;","})()"],rule:["function parse_#{node.name}() {"," #if options.cache",' var cacheKey = "#{node.name}@" + #{posOffset("pos")};'," var cachedResult = cache[cacheKey];"," if (cachedResult) {",' pos = #{posClone("cachedResult.nextPos")};'," return cachedResult.result;"," }"," "," #end"," #if node.resultVars.length > 0",' var #{node.resultVars.join(", ")};'," #end"," #if node.posVars.length > 0",' var #{node.posVars.join(", ")};'," #end"," "," #if node.displayName !== null"," reportFailures++;"," #end"," #block emit(node.expression)"," #if node.displayName !== null"," reportFailures--;"," if (reportFailures === 0 && #{node.resultVar} === null) {"," matchFailed(#{string(node.displayName)});"," }"," #end"," #if options.cache"," "," cache[cacheKey] = {",' nextPos: #{posClone("pos")},'," result: #{node.resultVar}"," };"," #end"," return #{node.resultVar};","}"],choice:["#block emit(alternative)","#block nextAlternativesCode"],"choice.next":["if (#{node.resultVar} === null) {"," #block code","}"],sequence:["#{posSave(node)};","#block code"],"sequence.iteration":["#block emit(element)","if (#{element.resultVar} !== null) {"," #block code","} else {"," #{node.resultVar} = null;"," #{posRestore(node)};","}"],"sequence.inner":['#{node.resultVar} = [#{pluck(node.elements, "resultVar").join(", ")}];'],simple_and:["#{posSave(node)};","reportFailures++;","#block emit(node.expression)","reportFailures--;","if (#{node.resultVar} !== null) {",' #{node.resultVar} = "";'," #{posRestore(node)};","} else {"," #{node.resultVar} = null;","}"],simple_not:["#{posSave(node)};","reportFailures++;","#block emit(node.expression)","reportFailures--;","if (#{node.resultVar} === null) {",' #{node.resultVar} = "";',"} else {"," #{node.resultVar} = null;"," #{posRestore(node)};","}"],semantic_and:['#{node.resultVar} = (function(#{(options.trackLineAndColumn ? ["offset", "line", "column"] : ["offset"]).concat(keys(node.params)).join(", ")}) {#{node.code}})(#{(options.trackLineAndColumn ? ["pos.offset", "pos.line", "pos.column"] : ["pos"]).concat(values(node.params)).join(", ")}) ? "" : null;'],semantic_not:['#{node.resultVar} = (function(#{(options.trackLineAndColumn ? ["offset", "line", "column"] : ["offset"]).concat(keys(node.params)).join(", ")}) {#{node.code}})(#{(options.trackLineAndColumn ? ["pos.offset", "pos.line", "pos.column"] : ["pos"]).concat(values(node.params)).join(", ")}) ? null : "";'],optional:["#block emit(node.expression)",'#{node.resultVar} = #{node.resultVar} !== null ? #{node.resultVar} : "";'],zero_or_more:["#{node.resultVar} = [];","#block emit(node.expression)","while (#{node.expression.resultVar} !== null) {"," #{node.resultVar}.push(#{node.expression.resultVar});"," #block emit(node.expression)","}"],one_or_more:["#block emit(node.expression)","if (#{node.expression.resultVar} !== null) {"," #{node.resultVar} = [];"," while (#{node.expression.resultVar} !== null) {"," #{node.resultVar}.push(#{node.expression.resultVar});"," #block emit(node.expression)"," }","} else {"," #{node.resultVar} = null;","}"],action:["#{posSave(node)};","#block emit(node.expression)","if (#{node.resultVar} !== null) {",' #{node.resultVar} = (function(#{(options.trackLineAndColumn ? ["offset", "line", "column"] : ["offset"]).concat(keys(node.params)).join(", ")}) {#{node.code}})(#{(options.trackLineAndColumn ? [node.posVar + ".offset", node.posVar + ".line", node.posVar + ".column"] : [node.posVar]).concat(values(node.params)).join(", ")});',"}","if (#{node.resultVar} === null) {"," #{posRestore(node)};","}"],rule_ref:["#{node.resultVar} = parse_#{node.name}();"],literal:["#if node.value.length === 0",' #{node.resultVar} = "";',"#else"," #if !node.ignoreCase"," #if node.value.length === 1",' if (input.charCodeAt(#{posOffset("pos")}) === #{node.value.charCodeAt(0)}) {'," #else",' if (input.substr(#{posOffset("pos")}, #{node.value.length}) === #{string(node.value)}) {'," #end"," #else",' if (input.substr(#{posOffset("pos")}, #{node.value.length}).toLowerCase() === #{string(node.value.toLowerCase())}) {'," #end"," #if !node.ignoreCase"," #{node.resultVar} = #{string(node.value)};"," #else",' #{node.resultVar} = input.substr(#{posOffset("pos")}, #{node.value.length});'," #end"," #{posAdvance(node.value.length)};"," } else {"," #{node.resultVar} = null;"," if (reportFailures === 0) {"," matchFailed(#{string(string(node.value))});"," }"," }","#end"],any:['if (input.length > #{posOffset("pos")}) {',' #{node.resultVar} = input.charAt(#{posOffset("pos")});'," #{posAdvance(1)};","} else {"," #{node.resultVar} = null;"," if (reportFailures === 0) {",' matchFailed("any character");'," }","}"],"class":['if (#{regexp}.test(input.charAt(#{posOffset("pos")}))) {',' #{node.resultVar} = input.charAt(#{posOffset("pos")});'," #{posAdvance(1)};","} else {"," #{node.resultVar} = null;"," if (reportFailures === 0) {"," matchFailed(#{string(node.rawText)});"," }","}"]};for(a in d)b[a]=c.template(d[a].join("\n"));return b}(),g=buildNodeVisitor({grammar:f("grammar"),initializer:function(a){return a.code},rule:f("rule"),choice:function(a){var b,c;for(var d=a.alternatives.length-1;d>=0;d--)c=d!==a.alternatives.length-1?e("choice.next",{node:a,code:b}):"",b=e("choice",{alternative:a.alternatives[d],nextAlternativesCode:c});return b},sequence:function(a){var b=e("sequence.inner",{node:a});for(var c=a.elements.length-1;c>=0;c--)b=e("sequence.iteration",{node:a,element:a.elements[c],code:b});return e("sequence",{node:a,code:b})},labeled:function(a){return g(a.expression)},simple_and:f("simple_and"),simple_not:f("simple_not"),semantic_and:f("semantic_and"),semantic_not:f("semantic_not"),optional:f("optional"),zero_or_more:f("zero_or_more"),one_or_more:f("one_or_more"),action:f("action"),rule_ref:f("rule_ref"),literal:f("literal"),any:f("any"),"class":function(a){var b;return a.parts.length>0?b="/^["+(a.inverted?"^":"")+map(a.parts,function(a){return a instanceof Array?quoteForRegexpClass(a[0])+"-"+quoteForRegexpClass(a[1]):quoteForRegexpClass(a)}).join("")+"]/"+(a.ignoreCase?"i":""):b=a.inverted?"/^[\\S\\s]/":"/^(?!)/",e("class",{node:a,regexp:b})}});return g(a)},PEG}();typeof module!="undefined"&&(module.exports=PEG);
@@ -47,6 +47,7 @@ smalltalk.parser = (function(){
47
47
  "string": parse_string,
48
48
  "symbol": parse_symbol,
49
49
  "number": parse_number,
50
+ "hex": parse_hex,
50
51
  "float": parse_float,
51
52
  "integer": parse_integer,
52
53
  "literalArray": parse_literalArray,
@@ -72,6 +73,7 @@ smalltalk.parser = (function(){
72
73
  "subexpression": parse_subexpression,
73
74
  "statements": parse_statements,
74
75
  "sequence": parse_sequence,
76
+ "stSequence": parse_stSequence,
75
77
  "block": parse_block,
76
78
  "operand": parse_operand,
77
79
  "unaryMessage": parse_unaryMessage,
@@ -96,10 +98,11 @@ smalltalk.parser = (function(){
96
98
  startRule = "method";
97
99
  }
98
100
 
99
- var pos = 0;
101
+ var pos = { offset: 0, line: 1, column: 1, seenCR: false };
100
102
  var reportFailures = 0;
101
- var rightmostFailuresPos = 0;
103
+ var rightmostFailuresPos = { offset: 0, line: 1, column: 1, seenCR: false };
102
104
  var rightmostFailuresExpected = [];
105
+ var cache = {};
103
106
 
104
107
  function padLeft(input, padding, length) {
105
108
  var result = input;
@@ -128,13 +131,43 @@ smalltalk.parser = (function(){
128
131
  return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
129
132
  }
130
133
 
134
+ function clone(object) {
135
+ var result = {};
136
+ for (var key in object) {
137
+ result[key] = object[key];
138
+ }
139
+ return result;
140
+ }
141
+
142
+ function advance(pos, n) {
143
+ var endOffset = pos.offset + n;
144
+
145
+ for (var offset = pos.offset; offset < endOffset; offset++) {
146
+ var ch = input.charAt(offset);
147
+ if (ch === "\n") {
148
+ if (!pos.seenCR) { pos.line++; }
149
+ pos.column = 1;
150
+ pos.seenCR = false;
151
+ } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
152
+ pos.line++;
153
+ pos.column = 1;
154
+ pos.seenCR = true;
155
+ } else {
156
+ pos.column++;
157
+ pos.seenCR = false;
158
+ }
159
+ }
160
+
161
+ pos.offset += n;
162
+ }
163
+
131
164
  function matchFailed(failure) {
132
- if (pos < rightmostFailuresPos) {
165
+ if (pos.offset < rightmostFailuresPos.offset) {
133
166
  return;
134
167
  }
135
168
 
136
- if (pos > rightmostFailuresPos) {
137
- rightmostFailuresPos = pos;
169
+ if (pos.offset > rightmostFailuresPos.offset) {
170
+ rightmostFailuresPos = clone(pos);
138
171
  rightmostFailuresExpected = [];
139
172
  }
140
173
 
@@ -142,11 +175,18 @@ smalltalk.parser = (function(){
142
175
  }
143
176
 
144
177
  function parse_separator() {
178
+ var cacheKey = "separator@" + pos.offset;
179
+ var cachedResult = cache[cacheKey];
180
+ if (cachedResult) {
181
+ pos = clone(cachedResult.nextPos);
182
+ return cachedResult.result;
183
+ }
184
+
145
185
  var result0, result1;
146
186
 
147
- if (/^[ \t\x0B\f\xA0\uFEFF\n\r\u2028\u2029]/.test(input.charAt(pos))) {
148
- result1 = input.charAt(pos);
149
- pos++;
187
+ if (/^[ \t\x0B\f\xA0\uFEFF\n\r\u2028\u2029]/.test(input.charAt(pos.offset))) {
188
+ result1 = input.charAt(pos.offset);
189
+ advance(pos, 1);
150
190
  } else {
151
191
  result1 = null;
152
192
  if (reportFailures === 0) {
@@ -157,9 +197,9 @@ smalltalk.parser = (function(){
157
197
  result0 = [];
158
198
  while (result1 !== null) {
159
199
  result0.push(result1);
160
- if (/^[ \t\x0B\f\xA0\uFEFF\n\r\u2028\u2029]/.test(input.charAt(pos))) {
161
- result1 = input.charAt(pos);
162
- pos++;
200
+ if (/^[ \t\x0B\f\xA0\uFEFF\n\r\u2028\u2029]/.test(input.charAt(pos.offset))) {
201
+ result1 = input.charAt(pos.offset);
202
+ advance(pos, 1);
163
203
  } else {
164
204
  result1 = null;
165
205
  if (reportFailures === 0) {
@@ -170,17 +210,29 @@ smalltalk.parser = (function(){
170
210
  } else {
171
211
  result0 = null;
172
212
  }
213
+
214
+ cache[cacheKey] = {
215
+ nextPos: clone(pos),
216
+ result: result0
217
+ };
173
218
  return result0;
174
219
  }
175
220
 
176
221
  function parse_comments() {
222
+ var cacheKey = "comments@" + pos.offset;
223
+ var cachedResult = cache[cacheKey];
224
+ if (cachedResult) {
225
+ pos = clone(cachedResult.nextPos);
226
+ return cachedResult.result;
227
+ }
228
+
177
229
  var result0, result1, result2, result3;
178
230
  var pos0;
179
231
 
180
- pos0 = pos;
181
- if (/^["]/.test(input.charAt(pos))) {
182
- result1 = input.charAt(pos);
183
- pos++;
232
+ pos0 = clone(pos);
233
+ if (/^["]/.test(input.charAt(pos.offset))) {
234
+ result1 = input.charAt(pos.offset);
235
+ advance(pos, 1);
184
236
  } else {
185
237
  result1 = null;
186
238
  if (reportFailures === 0) {
@@ -189,9 +241,9 @@ smalltalk.parser = (function(){
189
241
  }
190
242
  if (result1 !== null) {
191
243
  result2 = [];
192
- if (/^[^"]/.test(input.charAt(pos))) {
193
- result3 = input.charAt(pos);
194
- pos++;
244
+ if (/^[^"]/.test(input.charAt(pos.offset))) {
245
+ result3 = input.charAt(pos.offset);
246
+ advance(pos, 1);
195
247
  } else {
196
248
  result3 = null;
197
249
  if (reportFailures === 0) {
@@ -200,9 +252,9 @@ smalltalk.parser = (function(){
200
252
  }
201
253
  while (result3 !== null) {
202
254
  result2.push(result3);
203
- if (/^[^"]/.test(input.charAt(pos))) {
204
- result3 = input.charAt(pos);
205
- pos++;
255
+ if (/^[^"]/.test(input.charAt(pos.offset))) {
256
+ result3 = input.charAt(pos.offset);
257
+ advance(pos, 1);
206
258
  } else {
207
259
  result3 = null;
208
260
  if (reportFailures === 0) {
@@ -211,9 +263,9 @@ smalltalk.parser = (function(){
211
263
  }
212
264
  }
213
265
  if (result2 !== null) {
214
- if (/^["]/.test(input.charAt(pos))) {
215
- result3 = input.charAt(pos);
216
- pos++;
266
+ if (/^["]/.test(input.charAt(pos.offset))) {
267
+ result3 = input.charAt(pos.offset);
268
+ advance(pos, 1);
217
269
  } else {
218
270
  result3 = null;
219
271
  if (reportFailures === 0) {
@@ -224,24 +276,24 @@ smalltalk.parser = (function(){
224
276
  result1 = [result1, result2, result3];
225
277
  } else {
226
278
  result1 = null;
227
- pos = pos0;
279
+ pos = clone(pos0);
228
280
  }
229
281
  } else {
230
282
  result1 = null;
231
- pos = pos0;
283
+ pos = clone(pos0);
232
284
  }
233
285
  } else {
234
286
  result1 = null;
235
- pos = pos0;
287
+ pos = clone(pos0);
236
288
  }
237
289
  if (result1 !== null) {
238
290
  result0 = [];
239
291
  while (result1 !== null) {
240
292
  result0.push(result1);
241
- pos0 = pos;
242
- if (/^["]/.test(input.charAt(pos))) {
243
- result1 = input.charAt(pos);
244
- pos++;
293
+ pos0 = clone(pos);
294
+ if (/^["]/.test(input.charAt(pos.offset))) {
295
+ result1 = input.charAt(pos.offset);
296
+ advance(pos, 1);
245
297
  } else {
246
298
  result1 = null;
247
299
  if (reportFailures === 0) {
@@ -250,9 +302,9 @@ smalltalk.parser = (function(){
250
302
  }
251
303
  if (result1 !== null) {
252
304
  result2 = [];
253
- if (/^[^"]/.test(input.charAt(pos))) {
254
- result3 = input.charAt(pos);
255
- pos++;
305
+ if (/^[^"]/.test(input.charAt(pos.offset))) {
306
+ result3 = input.charAt(pos.offset);
307
+ advance(pos, 1);
256
308
  } else {
257
309
  result3 = null;
258
310
  if (reportFailures === 0) {
@@ -261,9 +313,9 @@ smalltalk.parser = (function(){
261
313
  }
262
314
  while (result3 !== null) {
263
315
  result2.push(result3);
264
- if (/^[^"]/.test(input.charAt(pos))) {
265
- result3 = input.charAt(pos);
266
- pos++;
316
+ if (/^[^"]/.test(input.charAt(pos.offset))) {
317
+ result3 = input.charAt(pos.offset);
318
+ advance(pos, 1);
267
319
  } else {
268
320
  result3 = null;
269
321
  if (reportFailures === 0) {
@@ -272,9 +324,9 @@ smalltalk.parser = (function(){
272
324
  }
273
325
  }
274
326
  if (result2 !== null) {
275
- if (/^["]/.test(input.charAt(pos))) {
276
- result3 = input.charAt(pos);
277
- pos++;
327
+ if (/^["]/.test(input.charAt(pos.offset))) {
328
+ result3 = input.charAt(pos.offset);
329
+ advance(pos, 1);
278
330
  } else {
279
331
  result3 = null;
280
332
  if (reportFailures === 0) {
@@ -285,24 +337,36 @@ smalltalk.parser = (function(){
285
337
  result1 = [result1, result2, result3];
286
338
  } else {
287
339
  result1 = null;
288
- pos = pos0;
340
+ pos = clone(pos0);
289
341
  }
290
342
  } else {
291
343
  result1 = null;
292
- pos = pos0;
344
+ pos = clone(pos0);
293
345
  }
294
346
  } else {
295
347
  result1 = null;
296
- pos = pos0;
348
+ pos = clone(pos0);
297
349
  }
298
350
  }
299
351
  } else {
300
352
  result0 = null;
301
353
  }
354
+
355
+ cache[cacheKey] = {
356
+ nextPos: clone(pos),
357
+ result: result0
358
+ };
302
359
  return result0;
303
360
  }
304
361
 
305
362
  function parse_ws() {
363
+ var cacheKey = "ws@" + pos.offset;
364
+ var cachedResult = cache[cacheKey];
365
+ if (cachedResult) {
366
+ pos = clone(cachedResult.nextPos);
367
+ return cachedResult.result;
368
+ }
369
+
306
370
  var result0, result1;
307
371
 
308
372
  result0 = [];
@@ -317,18 +381,30 @@ smalltalk.parser = (function(){
317
381
  result1 = parse_comments();
318
382
  }
319
383
  }
384
+
385
+ cache[cacheKey] = {
386
+ nextPos: clone(pos),
387
+ result: result0
388
+ };
320
389
  return result0;
321
390
  }
322
391
 
323
392
  function parse_identifier() {
393
+ var cacheKey = "identifier@" + pos.offset;
394
+ var cachedResult = cache[cacheKey];
395
+ if (cachedResult) {
396
+ pos = clone(cachedResult.nextPos);
397
+ return cachedResult.result;
398
+ }
399
+
324
400
  var result0, result1, result2;
325
401
  var pos0, pos1;
326
402
 
327
- pos0 = pos;
328
- pos1 = pos;
329
- if (/^[a-zA-Z]/.test(input.charAt(pos))) {
330
- result0 = input.charAt(pos);
331
- pos++;
403
+ pos0 = clone(pos);
404
+ pos1 = clone(pos);
405
+ if (/^[a-zA-Z]/.test(input.charAt(pos.offset))) {
406
+ result0 = input.charAt(pos.offset);
407
+ advance(pos, 1);
332
408
  } else {
333
409
  result0 = null;
334
410
  if (reportFailures === 0) {
@@ -337,9 +413,9 @@ smalltalk.parser = (function(){
337
413
  }
338
414
  if (result0 !== null) {
339
415
  result1 = [];
340
- if (/^[a-zA-Z0-9]/.test(input.charAt(pos))) {
341
- result2 = input.charAt(pos);
342
- pos++;
416
+ if (/^[a-zA-Z0-9]/.test(input.charAt(pos.offset))) {
417
+ result2 = input.charAt(pos.offset);
418
+ advance(pos, 1);
343
419
  } else {
344
420
  result2 = null;
345
421
  if (reportFailures === 0) {
@@ -348,9 +424,9 @@ smalltalk.parser = (function(){
348
424
  }
349
425
  while (result2 !== null) {
350
426
  result1.push(result2);
351
- if (/^[a-zA-Z0-9]/.test(input.charAt(pos))) {
352
- result2 = input.charAt(pos);
353
- pos++;
427
+ if (/^[a-zA-Z0-9]/.test(input.charAt(pos.offset))) {
428
+ result2 = input.charAt(pos.offset);
429
+ advance(pos, 1);
354
430
  } else {
355
431
  result2 = null;
356
432
  if (reportFailures === 0) {
@@ -362,30 +438,42 @@ smalltalk.parser = (function(){
362
438
  result0 = [result0, result1];
363
439
  } else {
364
440
  result0 = null;
365
- pos = pos1;
441
+ pos = clone(pos1);
366
442
  }
367
443
  } else {
368
444
  result0 = null;
369
- pos = pos1;
445
+ pos = clone(pos1);
370
446
  }
371
447
  if (result0 !== null) {
372
- result0 = (function(offset, first, others) {return first + others.join("")})(pos0, result0[0], result0[1]);
448
+ result0 = (function(offset, line, column, first, others) {return first + others.join("")})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
373
449
  }
374
450
  if (result0 === null) {
375
- pos = pos0;
451
+ pos = clone(pos0);
376
452
  }
453
+
454
+ cache[cacheKey] = {
455
+ nextPos: clone(pos),
456
+ result: result0
457
+ };
377
458
  return result0;
378
459
  }
379
460
 
380
461
  function parse_varIdentifier() {
462
+ var cacheKey = "varIdentifier@" + pos.offset;
463
+ var cachedResult = cache[cacheKey];
464
+ if (cachedResult) {
465
+ pos = clone(cachedResult.nextPos);
466
+ return cachedResult.result;
467
+ }
468
+
381
469
  var result0, result1, result2;
382
470
  var pos0, pos1;
383
471
 
384
- pos0 = pos;
385
- pos1 = pos;
386
- if (/^[a-z]/.test(input.charAt(pos))) {
387
- result0 = input.charAt(pos);
388
- pos++;
472
+ pos0 = clone(pos);
473
+ pos1 = clone(pos);
474
+ if (/^[a-z]/.test(input.charAt(pos.offset))) {
475
+ result0 = input.charAt(pos.offset);
476
+ advance(pos, 1);
389
477
  } else {
390
478
  result0 = null;
391
479
  if (reportFailures === 0) {
@@ -394,9 +482,9 @@ smalltalk.parser = (function(){
394
482
  }
395
483
  if (result0 !== null) {
396
484
  result1 = [];
397
- if (/^[a-zA-Z0-9]/.test(input.charAt(pos))) {
398
- result2 = input.charAt(pos);
399
- pos++;
485
+ if (/^[a-zA-Z0-9]/.test(input.charAt(pos.offset))) {
486
+ result2 = input.charAt(pos.offset);
487
+ advance(pos, 1);
400
488
  } else {
401
489
  result2 = null;
402
490
  if (reportFailures === 0) {
@@ -405,9 +493,9 @@ smalltalk.parser = (function(){
405
493
  }
406
494
  while (result2 !== null) {
407
495
  result1.push(result2);
408
- if (/^[a-zA-Z0-9]/.test(input.charAt(pos))) {
409
- result2 = input.charAt(pos);
410
- pos++;
496
+ if (/^[a-zA-Z0-9]/.test(input.charAt(pos.offset))) {
497
+ result2 = input.charAt(pos.offset);
498
+ advance(pos, 1);
411
499
  } else {
412
500
  result2 = null;
413
501
  if (reportFailures === 0) {
@@ -419,32 +507,44 @@ smalltalk.parser = (function(){
419
507
  result0 = [result0, result1];
420
508
  } else {
421
509
  result0 = null;
422
- pos = pos1;
510
+ pos = clone(pos1);
423
511
  }
424
512
  } else {
425
513
  result0 = null;
426
- pos = pos1;
514
+ pos = clone(pos1);
427
515
  }
428
516
  if (result0 !== null) {
429
- result0 = (function(offset, first, others) {return first + others.join("")})(pos0, result0[0], result0[1]);
517
+ result0 = (function(offset, line, column, first, others) {return first + others.join("")})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
430
518
  }
431
519
  if (result0 === null) {
432
- pos = pos0;
520
+ pos = clone(pos0);
433
521
  }
522
+
523
+ cache[cacheKey] = {
524
+ nextPos: clone(pos),
525
+ result: result0
526
+ };
434
527
  return result0;
435
528
  }
436
529
 
437
530
  function parse_keyword() {
531
+ var cacheKey = "keyword@" + pos.offset;
532
+ var cachedResult = cache[cacheKey];
533
+ if (cachedResult) {
534
+ pos = clone(cachedResult.nextPos);
535
+ return cachedResult.result;
536
+ }
537
+
438
538
  var result0, result1;
439
539
  var pos0, pos1;
440
540
 
441
- pos0 = pos;
442
- pos1 = pos;
541
+ pos0 = clone(pos);
542
+ pos1 = clone(pos);
443
543
  result0 = parse_identifier();
444
544
  if (result0 !== null) {
445
- if (/^[:]/.test(input.charAt(pos))) {
446
- result1 = input.charAt(pos);
447
- pos++;
545
+ if (/^[:]/.test(input.charAt(pos.offset))) {
546
+ result1 = input.charAt(pos.offset);
547
+ advance(pos, 1);
448
548
  } else {
449
549
  result1 = null;
450
550
  if (reportFailures === 0) {
@@ -455,30 +555,42 @@ smalltalk.parser = (function(){
455
555
  result0 = [result0, result1];
456
556
  } else {
457
557
  result0 = null;
458
- pos = pos1;
558
+ pos = clone(pos1);
459
559
  }
460
560
  } else {
461
561
  result0 = null;
462
- pos = pos1;
562
+ pos = clone(pos1);
463
563
  }
464
564
  if (result0 !== null) {
465
- result0 = (function(offset, first, last) {return first + last})(pos0, result0[0], result0[1]);
565
+ result0 = (function(offset, line, column, first, last) {return first + last})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
466
566
  }
467
567
  if (result0 === null) {
468
- pos = pos0;
568
+ pos = clone(pos0);
469
569
  }
570
+
571
+ cache[cacheKey] = {
572
+ nextPos: clone(pos),
573
+ result: result0
574
+ };
470
575
  return result0;
471
576
  }
472
577
 
473
578
  function parse_className() {
579
+ var cacheKey = "className@" + pos.offset;
580
+ var cachedResult = cache[cacheKey];
581
+ if (cachedResult) {
582
+ pos = clone(cachedResult.nextPos);
583
+ return cachedResult.result;
584
+ }
585
+
474
586
  var result0, result1, result2;
475
587
  var pos0, pos1;
476
588
 
477
- pos0 = pos;
478
- pos1 = pos;
479
- if (/^[A-Z]/.test(input.charAt(pos))) {
480
- result0 = input.charAt(pos);
481
- pos++;
589
+ pos0 = clone(pos);
590
+ pos1 = clone(pos);
591
+ if (/^[A-Z]/.test(input.charAt(pos.offset))) {
592
+ result0 = input.charAt(pos.offset);
593
+ advance(pos, 1);
482
594
  } else {
483
595
  result0 = null;
484
596
  if (reportFailures === 0) {
@@ -487,9 +599,9 @@ smalltalk.parser = (function(){
487
599
  }
488
600
  if (result0 !== null) {
489
601
  result1 = [];
490
- if (/^[a-zA-Z0-9]/.test(input.charAt(pos))) {
491
- result2 = input.charAt(pos);
492
- pos++;
602
+ if (/^[a-zA-Z0-9]/.test(input.charAt(pos.offset))) {
603
+ result2 = input.charAt(pos.offset);
604
+ advance(pos, 1);
493
605
  } else {
494
606
  result2 = null;
495
607
  if (reportFailures === 0) {
@@ -498,9 +610,9 @@ smalltalk.parser = (function(){
498
610
  }
499
611
  while (result2 !== null) {
500
612
  result1.push(result2);
501
- if (/^[a-zA-Z0-9]/.test(input.charAt(pos))) {
502
- result2 = input.charAt(pos);
503
- pos++;
613
+ if (/^[a-zA-Z0-9]/.test(input.charAt(pos.offset))) {
614
+ result2 = input.charAt(pos.offset);
615
+ advance(pos, 1);
504
616
  } else {
505
617
  result2 = null;
506
618
  if (reportFailures === 0) {
@@ -512,30 +624,42 @@ smalltalk.parser = (function(){
512
624
  result0 = [result0, result1];
513
625
  } else {
514
626
  result0 = null;
515
- pos = pos1;
627
+ pos = clone(pos1);
516
628
  }
517
629
  } else {
518
630
  result0 = null;
519
- pos = pos1;
631
+ pos = clone(pos1);
520
632
  }
521
633
  if (result0 !== null) {
522
- result0 = (function(offset, first, others) {return first + others.join("")})(pos0, result0[0], result0[1]);
634
+ result0 = (function(offset, line, column, first, others) {return first + others.join("")})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
523
635
  }
524
636
  if (result0 === null) {
525
- pos = pos0;
637
+ pos = clone(pos0);
526
638
  }
639
+
640
+ cache[cacheKey] = {
641
+ nextPos: clone(pos),
642
+ result: result0
643
+ };
527
644
  return result0;
528
645
  }
529
646
 
530
647
  function parse_string() {
648
+ var cacheKey = "string@" + pos.offset;
649
+ var cachedResult = cache[cacheKey];
650
+ if (cachedResult) {
651
+ pos = clone(cachedResult.nextPos);
652
+ return cachedResult.result;
653
+ }
654
+
531
655
  var result0, result1, result2;
532
656
  var pos0, pos1, pos2;
533
657
 
534
- pos0 = pos;
535
- pos1 = pos;
536
- if (/^[']/.test(input.charAt(pos))) {
537
- result0 = input.charAt(pos);
538
- pos++;
658
+ pos0 = clone(pos);
659
+ pos1 = clone(pos);
660
+ if (/^[']/.test(input.charAt(pos.offset))) {
661
+ result0 = input.charAt(pos.offset);
662
+ advance(pos, 1);
539
663
  } else {
540
664
  result0 = null;
541
665
  if (reportFailures === 0) {
@@ -544,10 +668,10 @@ smalltalk.parser = (function(){
544
668
  }
545
669
  if (result0 !== null) {
546
670
  result1 = [];
547
- pos2 = pos;
548
- if (input.substr(pos, 2) === "''") {
671
+ pos2 = clone(pos);
672
+ if (input.substr(pos.offset, 2) === "''") {
549
673
  result2 = "''";
550
- pos += 2;
674
+ advance(pos, 2);
551
675
  } else {
552
676
  result2 = null;
553
677
  if (reportFailures === 0) {
@@ -555,15 +679,15 @@ smalltalk.parser = (function(){
555
679
  }
556
680
  }
557
681
  if (result2 !== null) {
558
- result2 = (function(offset) {return "'"})(pos2);
682
+ result2 = (function(offset, line, column) {return "'"})(pos2.offset, pos2.line, pos2.column);
559
683
  }
560
684
  if (result2 === null) {
561
- pos = pos2;
685
+ pos = clone(pos2);
562
686
  }
563
687
  if (result2 === null) {
564
- if (/^[^']/.test(input.charAt(pos))) {
565
- result2 = input.charAt(pos);
566
- pos++;
688
+ if (/^[^']/.test(input.charAt(pos.offset))) {
689
+ result2 = input.charAt(pos.offset);
690
+ advance(pos, 1);
567
691
  } else {
568
692
  result2 = null;
569
693
  if (reportFailures === 0) {
@@ -573,10 +697,10 @@ smalltalk.parser = (function(){
573
697
  }
574
698
  while (result2 !== null) {
575
699
  result1.push(result2);
576
- pos2 = pos;
577
- if (input.substr(pos, 2) === "''") {
700
+ pos2 = clone(pos);
701
+ if (input.substr(pos.offset, 2) === "''") {
578
702
  result2 = "''";
579
- pos += 2;
703
+ advance(pos, 2);
580
704
  } else {
581
705
  result2 = null;
582
706
  if (reportFailures === 0) {
@@ -584,15 +708,15 @@ smalltalk.parser = (function(){
584
708
  }
585
709
  }
586
710
  if (result2 !== null) {
587
- result2 = (function(offset) {return "'"})(pos2);
711
+ result2 = (function(offset, line, column) {return "'"})(pos2.offset, pos2.line, pos2.column);
588
712
  }
589
713
  if (result2 === null) {
590
- pos = pos2;
714
+ pos = clone(pos2);
591
715
  }
592
716
  if (result2 === null) {
593
- if (/^[^']/.test(input.charAt(pos))) {
594
- result2 = input.charAt(pos);
595
- pos++;
717
+ if (/^[^']/.test(input.charAt(pos.offset))) {
718
+ result2 = input.charAt(pos.offset);
719
+ advance(pos, 1);
596
720
  } else {
597
721
  result2 = null;
598
722
  if (reportFailures === 0) {
@@ -602,9 +726,9 @@ smalltalk.parser = (function(){
602
726
  }
603
727
  }
604
728
  if (result1 !== null) {
605
- if (/^[']/.test(input.charAt(pos))) {
606
- result2 = input.charAt(pos);
607
- pos++;
729
+ if (/^[']/.test(input.charAt(pos.offset))) {
730
+ result2 = input.charAt(pos.offset);
731
+ advance(pos, 1);
608
732
  } else {
609
733
  result2 = null;
610
734
  if (reportFailures === 0) {
@@ -615,37 +739,49 @@ smalltalk.parser = (function(){
615
739
  result0 = [result0, result1, result2];
616
740
  } else {
617
741
  result0 = null;
618
- pos = pos1;
742
+ pos = clone(pos1);
619
743
  }
620
744
  } else {
621
745
  result0 = null;
622
- pos = pos1;
746
+ pos = clone(pos1);
623
747
  }
624
748
  } else {
625
749
  result0 = null;
626
- pos = pos1;
750
+ pos = clone(pos1);
627
751
  }
628
752
  if (result0 !== null) {
629
- result0 = (function(offset, val) {
630
- return smalltalk.ValueNode._new()
631
- ._value_(val.join("").replace(/\"/ig, '"'))
632
- })(pos0, result0[1]);
753
+ result0 = (function(offset, line, column, val) {
754
+ return smalltalk.ValueNode._new()
755
+ ._value_(val.join("").replace(/\"/ig, '"'))
756
+ })(pos0.offset, pos0.line, pos0.column, result0[1]);
633
757
  }
634
758
  if (result0 === null) {
635
- pos = pos0;
759
+ pos = clone(pos0);
636
760
  }
761
+
762
+ cache[cacheKey] = {
763
+ nextPos: clone(pos),
764
+ result: result0
765
+ };
637
766
  return result0;
638
767
  }
639
768
 
640
769
  function parse_symbol() {
770
+ var cacheKey = "symbol@" + pos.offset;
771
+ var cachedResult = cache[cacheKey];
772
+ if (cachedResult) {
773
+ pos = clone(cachedResult.nextPos);
774
+ return cachedResult.result;
775
+ }
776
+
641
777
  var result0, result1, result2, result3;
642
778
  var pos0, pos1, pos2;
643
779
 
644
- pos0 = pos;
645
- pos1 = pos;
646
- if (input.charCodeAt(pos) === 35) {
780
+ pos0 = clone(pos);
781
+ pos1 = clone(pos);
782
+ if (input.charCodeAt(pos.offset) === 35) {
647
783
  result0 = "#";
648
- pos++;
784
+ advance(pos, 1);
649
785
  } else {
650
786
  result0 = null;
651
787
  if (reportFailures === 0) {
@@ -654,10 +790,10 @@ smalltalk.parser = (function(){
654
790
  }
655
791
  if (result0 !== null) {
656
792
  result1 = [];
657
- pos2 = pos;
658
- if (/^[a-zA-Z0-9:]/.test(input.charAt(pos))) {
659
- result3 = input.charAt(pos);
660
- pos++;
793
+ pos2 = clone(pos);
794
+ if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
795
+ result3 = input.charAt(pos.offset);
796
+ advance(pos, 1);
661
797
  } else {
662
798
  result3 = null;
663
799
  if (reportFailures === 0) {
@@ -668,9 +804,9 @@ smalltalk.parser = (function(){
668
804
  result2 = [];
669
805
  while (result3 !== null) {
670
806
  result2.push(result3);
671
- if (/^[a-zA-Z0-9:]/.test(input.charAt(pos))) {
672
- result3 = input.charAt(pos);
673
- pos++;
807
+ if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
808
+ result3 = input.charAt(pos.offset);
809
+ advance(pos, 1);
674
810
  } else {
675
811
  result3 = null;
676
812
  if (reportFailures === 0) {
@@ -682,27 +818,27 @@ smalltalk.parser = (function(){
682
818
  result2 = null;
683
819
  }
684
820
  if (result2 !== null) {
685
- result2 = (function(offset, digits) {return digits.join("")})(pos2, result2);
821
+ result2 = (function(offset, line, column, digits) {return digits.join("")})(pos2.offset, pos2.line, pos2.column, result2);
686
822
  }
687
823
  if (result2 === null) {
688
- pos = pos2;
824
+ pos = clone(pos2);
689
825
  }
690
826
  if (result2 === null) {
691
- pos2 = pos;
827
+ pos2 = clone(pos);
692
828
  result2 = parse_string();
693
829
  if (result2 !== null) {
694
- result2 = (function(offset, node) {return node._value()})(pos2, result2);
830
+ result2 = (function(offset, line, column, node) {return node._value()})(pos2.offset, pos2.line, pos2.column, result2);
695
831
  }
696
832
  if (result2 === null) {
697
- pos = pos2;
833
+ pos = clone(pos2);
698
834
  }
699
835
  }
700
836
  while (result2 !== null) {
701
837
  result1.push(result2);
702
- pos2 = pos;
703
- if (/^[a-zA-Z0-9:]/.test(input.charAt(pos))) {
704
- result3 = input.charAt(pos);
705
- pos++;
838
+ pos2 = clone(pos);
839
+ if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
840
+ result3 = input.charAt(pos.offset);
841
+ advance(pos, 1);
706
842
  } else {
707
843
  result3 = null;
708
844
  if (reportFailures === 0) {
@@ -713,9 +849,9 @@ smalltalk.parser = (function(){
713
849
  result2 = [];
714
850
  while (result3 !== null) {
715
851
  result2.push(result3);
716
- if (/^[a-zA-Z0-9:]/.test(input.charAt(pos))) {
717
- result3 = input.charAt(pos);
718
- pos++;
852
+ if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
853
+ result3 = input.charAt(pos.offset);
854
+ advance(pos, 1);
719
855
  } else {
720
856
  result3 = null;
721
857
  if (reportFailures === 0) {
@@ -727,19 +863,19 @@ smalltalk.parser = (function(){
727
863
  result2 = null;
728
864
  }
729
865
  if (result2 !== null) {
730
- result2 = (function(offset, digits) {return digits.join("")})(pos2, result2);
866
+ result2 = (function(offset, line, column, digits) {return digits.join("")})(pos2.offset, pos2.line, pos2.column, result2);
731
867
  }
732
868
  if (result2 === null) {
733
- pos = pos2;
869
+ pos = clone(pos2);
734
870
  }
735
871
  if (result2 === null) {
736
- pos2 = pos;
872
+ pos2 = clone(pos);
737
873
  result2 = parse_string();
738
874
  if (result2 !== null) {
739
- result2 = (function(offset, node) {return node._value()})(pos2, result2);
875
+ result2 = (function(offset, line, column, node) {return node._value()})(pos2.offset, pos2.line, pos2.column, result2);
740
876
  }
741
877
  if (result2 === null) {
742
- pos = pos2;
878
+ pos = clone(pos2);
743
879
  }
744
880
  }
745
881
  }
@@ -747,54 +883,169 @@ smalltalk.parser = (function(){
747
883
  result0 = [result0, result1];
748
884
  } else {
749
885
  result0 = null;
750
- pos = pos1;
886
+ pos = clone(pos1);
751
887
  }
752
888
  } else {
753
889
  result0 = null;
754
- pos = pos1;
890
+ pos = clone(pos1);
755
891
  }
756
892
  if (result0 !== null) {
757
- result0 = (function(offset, val) {
758
- return smalltalk.ValueNode._new()
759
- ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"')))
760
- })(pos0, result0[1]);
893
+ result0 = (function(offset, line, column, val) {
894
+ return smalltalk.ValueNode._new()
895
+ ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"')))
896
+ })(pos0.offset, pos0.line, pos0.column, result0[1]);
761
897
  }
762
898
  if (result0 === null) {
763
- pos = pos0;
899
+ pos = clone(pos0);
764
900
  }
901
+
902
+ cache[cacheKey] = {
903
+ nextPos: clone(pos),
904
+ result: result0
905
+ };
765
906
  return result0;
766
907
  }
767
908
 
768
909
  function parse_number() {
910
+ var cacheKey = "number@" + pos.offset;
911
+ var cachedResult = cache[cacheKey];
912
+ if (cachedResult) {
913
+ pos = clone(cachedResult.nextPos);
914
+ return cachedResult.result;
915
+ }
916
+
769
917
  var result0;
770
918
  var pos0;
771
919
 
772
- pos0 = pos;
773
- result0 = parse_float();
920
+ pos0 = clone(pos);
921
+ result0 = parse_hex();
774
922
  if (result0 === null) {
775
- result0 = parse_integer();
923
+ result0 = parse_float();
924
+ if (result0 === null) {
925
+ result0 = parse_integer();
926
+ }
927
+ }
928
+ if (result0 !== null) {
929
+ result0 = (function(offset, line, column, n) {
930
+ return smalltalk.ValueNode._new()
931
+ ._value_(n)
932
+ })(pos0.offset, pos0.line, pos0.column, result0);
933
+ }
934
+ if (result0 === null) {
935
+ pos = clone(pos0);
936
+ }
937
+
938
+ cache[cacheKey] = {
939
+ nextPos: clone(pos),
940
+ result: result0
941
+ };
942
+ return result0;
943
+ }
944
+
945
+ function parse_hex() {
946
+ var cacheKey = "hex@" + pos.offset;
947
+ var cachedResult = cache[cacheKey];
948
+ if (cachedResult) {
949
+ pos = clone(cachedResult.nextPos);
950
+ return cachedResult.result;
951
+ }
952
+
953
+ var result0, result1, result2, result3;
954
+ var pos0, pos1;
955
+
956
+ pos0 = clone(pos);
957
+ pos1 = clone(pos);
958
+ if (/^[\-]/.test(input.charAt(pos.offset))) {
959
+ result0 = input.charAt(pos.offset);
960
+ advance(pos, 1);
961
+ } else {
962
+ result0 = null;
963
+ if (reportFailures === 0) {
964
+ matchFailed("[\\-]");
965
+ }
966
+ }
967
+ result0 = result0 !== null ? result0 : "";
968
+ if (result0 !== null) {
969
+ if (input.substr(pos.offset, 3) === "16r") {
970
+ result1 = "16r";
971
+ advance(pos, 3);
972
+ } else {
973
+ result1 = null;
974
+ if (reportFailures === 0) {
975
+ matchFailed("\"16r\"");
976
+ }
977
+ }
978
+ if (result1 !== null) {
979
+ if (/^[0-9a-fA-F]/.test(input.charAt(pos.offset))) {
980
+ result3 = input.charAt(pos.offset);
981
+ advance(pos, 1);
982
+ } else {
983
+ result3 = null;
984
+ if (reportFailures === 0) {
985
+ matchFailed("[0-9a-fA-F]");
986
+ }
987
+ }
988
+ if (result3 !== null) {
989
+ result2 = [];
990
+ while (result3 !== null) {
991
+ result2.push(result3);
992
+ if (/^[0-9a-fA-F]/.test(input.charAt(pos.offset))) {
993
+ result3 = input.charAt(pos.offset);
994
+ advance(pos, 1);
995
+ } else {
996
+ result3 = null;
997
+ if (reportFailures === 0) {
998
+ matchFailed("[0-9a-fA-F]");
999
+ }
1000
+ }
1001
+ }
1002
+ } else {
1003
+ result2 = null;
1004
+ }
1005
+ if (result2 !== null) {
1006
+ result0 = [result0, result1, result2];
1007
+ } else {
1008
+ result0 = null;
1009
+ pos = clone(pos1);
1010
+ }
1011
+ } else {
1012
+ result0 = null;
1013
+ pos = clone(pos1);
1014
+ }
1015
+ } else {
1016
+ result0 = null;
1017
+ pos = clone(pos1);
776
1018
  }
777
1019
  if (result0 !== null) {
778
- result0 = (function(offset, n) {
779
- return smalltalk.ValueNode._new()
780
- ._value_(n)
781
- })(pos0, result0);
1020
+ result0 = (function(offset, line, column, neg, num) {return parseInt((neg + num.join("")), 16)})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
782
1021
  }
783
1022
  if (result0 === null) {
784
- pos = pos0;
1023
+ pos = clone(pos0);
785
1024
  }
1025
+
1026
+ cache[cacheKey] = {
1027
+ nextPos: clone(pos),
1028
+ result: result0
1029
+ };
786
1030
  return result0;
787
1031
  }
788
1032
 
789
1033
  function parse_float() {
1034
+ var cacheKey = "float@" + pos.offset;
1035
+ var cachedResult = cache[cacheKey];
1036
+ if (cachedResult) {
1037
+ pos = clone(cachedResult.nextPos);
1038
+ return cachedResult.result;
1039
+ }
1040
+
790
1041
  var result0, result1, result2, result3, result4;
791
1042
  var pos0, pos1;
792
1043
 
793
- pos0 = pos;
794
- pos1 = pos;
795
- if (/^[\-]/.test(input.charAt(pos))) {
796
- result0 = input.charAt(pos);
797
- pos++;
1044
+ pos0 = clone(pos);
1045
+ pos1 = clone(pos);
1046
+ if (/^[\-]/.test(input.charAt(pos.offset))) {
1047
+ result0 = input.charAt(pos.offset);
1048
+ advance(pos, 1);
798
1049
  } else {
799
1050
  result0 = null;
800
1051
  if (reportFailures === 0) {
@@ -803,9 +1054,9 @@ smalltalk.parser = (function(){
803
1054
  }
804
1055
  result0 = result0 !== null ? result0 : "";
805
1056
  if (result0 !== null) {
806
- if (/^[0-9]/.test(input.charAt(pos))) {
807
- result2 = input.charAt(pos);
808
- pos++;
1057
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
1058
+ result2 = input.charAt(pos.offset);
1059
+ advance(pos, 1);
809
1060
  } else {
810
1061
  result2 = null;
811
1062
  if (reportFailures === 0) {
@@ -816,9 +1067,9 @@ smalltalk.parser = (function(){
816
1067
  result1 = [];
817
1068
  while (result2 !== null) {
818
1069
  result1.push(result2);
819
- if (/^[0-9]/.test(input.charAt(pos))) {
820
- result2 = input.charAt(pos);
821
- pos++;
1070
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
1071
+ result2 = input.charAt(pos.offset);
1072
+ advance(pos, 1);
822
1073
  } else {
823
1074
  result2 = null;
824
1075
  if (reportFailures === 0) {
@@ -830,9 +1081,9 @@ smalltalk.parser = (function(){
830
1081
  result1 = null;
831
1082
  }
832
1083
  if (result1 !== null) {
833
- if (input.charCodeAt(pos) === 46) {
1084
+ if (input.charCodeAt(pos.offset) === 46) {
834
1085
  result2 = ".";
835
- pos++;
1086
+ advance(pos, 1);
836
1087
  } else {
837
1088
  result2 = null;
838
1089
  if (reportFailures === 0) {
@@ -840,9 +1091,9 @@ smalltalk.parser = (function(){
840
1091
  }
841
1092
  }
842
1093
  if (result2 !== null) {
843
- if (/^[0-9]/.test(input.charAt(pos))) {
844
- result4 = input.charAt(pos);
845
- pos++;
1094
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
1095
+ result4 = input.charAt(pos.offset);
1096
+ advance(pos, 1);
846
1097
  } else {
847
1098
  result4 = null;
848
1099
  if (reportFailures === 0) {
@@ -853,9 +1104,9 @@ smalltalk.parser = (function(){
853
1104
  result3 = [];
854
1105
  while (result4 !== null) {
855
1106
  result3.push(result4);
856
- if (/^[0-9]/.test(input.charAt(pos))) {
857
- result4 = input.charAt(pos);
858
- pos++;
1107
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
1108
+ result4 = input.charAt(pos.offset);
1109
+ advance(pos, 1);
859
1110
  } else {
860
1111
  result4 = null;
861
1112
  if (reportFailures === 0) {
@@ -870,38 +1121,50 @@ smalltalk.parser = (function(){
870
1121
  result0 = [result0, result1, result2, result3];
871
1122
  } else {
872
1123
  result0 = null;
873
- pos = pos1;
1124
+ pos = clone(pos1);
874
1125
  }
875
1126
  } else {
876
1127
  result0 = null;
877
- pos = pos1;
1128
+ pos = clone(pos1);
878
1129
  }
879
1130
  } else {
880
1131
  result0 = null;
881
- pos = pos1;
1132
+ pos = clone(pos1);
882
1133
  }
883
1134
  } else {
884
1135
  result0 = null;
885
- pos = pos1;
1136
+ pos = clone(pos1);
886
1137
  }
887
1138
  if (result0 !== null) {
888
- result0 = (function(offset, neg, int, dec) {return parseFloat((neg + int.join("") + "." + dec.join("")), 10)})(pos0, result0[0], result0[1], result0[3]);
1139
+ result0 = (function(offset, line, column, neg, int, dec) {return parseFloat((neg + int.join("") + "." + dec.join("")), 10)})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1], result0[3]);
889
1140
  }
890
1141
  if (result0 === null) {
891
- pos = pos0;
1142
+ pos = clone(pos0);
892
1143
  }
1144
+
1145
+ cache[cacheKey] = {
1146
+ nextPos: clone(pos),
1147
+ result: result0
1148
+ };
893
1149
  return result0;
894
1150
  }
895
1151
 
896
1152
  function parse_integer() {
1153
+ var cacheKey = "integer@" + pos.offset;
1154
+ var cachedResult = cache[cacheKey];
1155
+ if (cachedResult) {
1156
+ pos = clone(cachedResult.nextPos);
1157
+ return cachedResult.result;
1158
+ }
1159
+
897
1160
  var result0, result1, result2;
898
1161
  var pos0, pos1;
899
1162
 
900
- pos0 = pos;
901
- pos1 = pos;
902
- if (/^[\-]/.test(input.charAt(pos))) {
903
- result0 = input.charAt(pos);
904
- pos++;
1163
+ pos0 = clone(pos);
1164
+ pos1 = clone(pos);
1165
+ if (/^[\-]/.test(input.charAt(pos.offset))) {
1166
+ result0 = input.charAt(pos.offset);
1167
+ advance(pos, 1);
905
1168
  } else {
906
1169
  result0 = null;
907
1170
  if (reportFailures === 0) {
@@ -910,9 +1173,9 @@ smalltalk.parser = (function(){
910
1173
  }
911
1174
  result0 = result0 !== null ? result0 : "";
912
1175
  if (result0 !== null) {
913
- if (/^[0-9]/.test(input.charAt(pos))) {
914
- result2 = input.charAt(pos);
915
- pos++;
1176
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
1177
+ result2 = input.charAt(pos.offset);
1178
+ advance(pos, 1);
916
1179
  } else {
917
1180
  result2 = null;
918
1181
  if (reportFailures === 0) {
@@ -923,9 +1186,9 @@ smalltalk.parser = (function(){
923
1186
  result1 = [];
924
1187
  while (result2 !== null) {
925
1188
  result1.push(result2);
926
- if (/^[0-9]/.test(input.charAt(pos))) {
927
- result2 = input.charAt(pos);
928
- pos++;
1189
+ if (/^[0-9]/.test(input.charAt(pos.offset))) {
1190
+ result2 = input.charAt(pos.offset);
1191
+ advance(pos, 1);
929
1192
  } else {
930
1193
  result2 = null;
931
1194
  if (reportFailures === 0) {
@@ -940,30 +1203,42 @@ smalltalk.parser = (function(){
940
1203
  result0 = [result0, result1];
941
1204
  } else {
942
1205
  result0 = null;
943
- pos = pos1;
1206
+ pos = clone(pos1);
944
1207
  }
945
1208
  } else {
946
1209
  result0 = null;
947
- pos = pos1;
1210
+ pos = clone(pos1);
948
1211
  }
949
1212
  if (result0 !== null) {
950
- result0 = (function(offset, neg, digits) {return (parseInt(neg+digits.join(""), 10))})(pos0, result0[0], result0[1]);
1213
+ result0 = (function(offset, line, column, neg, digits) {return (parseInt(neg+digits.join(""), 10))})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
951
1214
  }
952
1215
  if (result0 === null) {
953
- pos = pos0;
1216
+ pos = clone(pos0);
954
1217
  }
1218
+
1219
+ cache[cacheKey] = {
1220
+ nextPos: clone(pos),
1221
+ result: result0
1222
+ };
955
1223
  return result0;
956
1224
  }
957
1225
 
958
1226
  function parse_literalArray() {
1227
+ var cacheKey = "literalArray@" + pos.offset;
1228
+ var cachedResult = cache[cacheKey];
1229
+ if (cachedResult) {
1230
+ pos = clone(cachedResult.nextPos);
1231
+ return cachedResult.result;
1232
+ }
1233
+
959
1234
  var result0, result1, result2, result3, result4;
960
1235
  var pos0, pos1, pos2, pos3;
961
1236
 
962
- pos0 = pos;
963
- pos1 = pos;
964
- if (input.substr(pos, 2) === "#(") {
1237
+ pos0 = clone(pos);
1238
+ pos1 = clone(pos);
1239
+ if (input.substr(pos.offset, 2) === "#(") {
965
1240
  result0 = "#(";
966
- pos += 2;
1241
+ advance(pos, 2);
967
1242
  } else {
968
1243
  result0 = null;
969
1244
  if (reportFailures === 0) {
@@ -974,8 +1249,8 @@ smalltalk.parser = (function(){
974
1249
  result1 = parse_ws();
975
1250
  if (result1 !== null) {
976
1251
  result2 = [];
977
- pos2 = pos;
978
- pos3 = pos;
1252
+ pos2 = clone(pos);
1253
+ pos3 = clone(pos);
979
1254
  result3 = parse_literal();
980
1255
  if (result3 !== null) {
981
1256
  result4 = parse_ws();
@@ -983,22 +1258,22 @@ smalltalk.parser = (function(){
983
1258
  result3 = [result3, result4];
984
1259
  } else {
985
1260
  result3 = null;
986
- pos = pos3;
1261
+ pos = clone(pos3);
987
1262
  }
988
1263
  } else {
989
1264
  result3 = null;
990
- pos = pos3;
1265
+ pos = clone(pos3);
991
1266
  }
992
1267
  if (result3 !== null) {
993
- result3 = (function(offset, lit) {return lit._value()})(pos2, result3[0]);
1268
+ result3 = (function(offset, line, column, lit) {return lit._value()})(pos2.offset, pos2.line, pos2.column, result3[0]);
994
1269
  }
995
1270
  if (result3 === null) {
996
- pos = pos2;
1271
+ pos = clone(pos2);
997
1272
  }
998
1273
  while (result3 !== null) {
999
1274
  result2.push(result3);
1000
- pos2 = pos;
1001
- pos3 = pos;
1275
+ pos2 = clone(pos);
1276
+ pos3 = clone(pos);
1002
1277
  result3 = parse_literal();
1003
1278
  if (result3 !== null) {
1004
1279
  result4 = parse_ws();
@@ -1006,25 +1281,25 @@ smalltalk.parser = (function(){
1006
1281
  result3 = [result3, result4];
1007
1282
  } else {
1008
1283
  result3 = null;
1009
- pos = pos3;
1284
+ pos = clone(pos3);
1010
1285
  }
1011
1286
  } else {
1012
1287
  result3 = null;
1013
- pos = pos3;
1288
+ pos = clone(pos3);
1014
1289
  }
1015
1290
  if (result3 !== null) {
1016
- result3 = (function(offset, lit) {return lit._value()})(pos2, result3[0]);
1291
+ result3 = (function(offset, line, column, lit) {return lit._value()})(pos2.offset, pos2.line, pos2.column, result3[0]);
1017
1292
  }
1018
1293
  if (result3 === null) {
1019
- pos = pos2;
1294
+ pos = clone(pos2);
1020
1295
  }
1021
1296
  }
1022
1297
  if (result2 !== null) {
1023
1298
  result3 = parse_ws();
1024
1299
  if (result3 !== null) {
1025
- if (input.charCodeAt(pos) === 41) {
1300
+ if (input.charCodeAt(pos.offset) === 41) {
1026
1301
  result4 = ")";
1027
- pos++;
1302
+ advance(pos, 1);
1028
1303
  } else {
1029
1304
  result4 = null;
1030
1305
  if (reportFailures === 0) {
@@ -1035,45 +1310,57 @@ smalltalk.parser = (function(){
1035
1310
  result0 = [result0, result1, result2, result3, result4];
1036
1311
  } else {
1037
1312
  result0 = null;
1038
- pos = pos1;
1313
+ pos = clone(pos1);
1039
1314
  }
1040
1315
  } else {
1041
1316
  result0 = null;
1042
- pos = pos1;
1317
+ pos = clone(pos1);
1043
1318
  }
1044
1319
  } else {
1045
1320
  result0 = null;
1046
- pos = pos1;
1321
+ pos = clone(pos1);
1047
1322
  }
1048
1323
  } else {
1049
1324
  result0 = null;
1050
- pos = pos1;
1325
+ pos = clone(pos1);
1051
1326
  }
1052
1327
  } else {
1053
1328
  result0 = null;
1054
- pos = pos1;
1329
+ pos = clone(pos1);
1055
1330
  }
1056
1331
  if (result0 !== null) {
1057
- result0 = (function(offset, lits) {
1058
- return smalltalk.ValueNode._new()
1059
- ._value_(lits)
1060
- })(pos0, result0[2]);
1332
+ result0 = (function(offset, line, column, lits) {
1333
+ return smalltalk.ValueNode._new()
1334
+ ._value_(lits)
1335
+ })(pos0.offset, pos0.line, pos0.column, result0[2]);
1061
1336
  }
1062
1337
  if (result0 === null) {
1063
- pos = pos0;
1338
+ pos = clone(pos0);
1064
1339
  }
1340
+
1341
+ cache[cacheKey] = {
1342
+ nextPos: clone(pos),
1343
+ result: result0
1344
+ };
1065
1345
  return result0;
1066
1346
  }
1067
1347
 
1068
1348
  function parse_dynamicArray() {
1349
+ var cacheKey = "dynamicArray@" + pos.offset;
1350
+ var cachedResult = cache[cacheKey];
1351
+ if (cachedResult) {
1352
+ pos = clone(cachedResult.nextPos);
1353
+ return cachedResult.result;
1354
+ }
1355
+
1069
1356
  var result0, result1, result2, result3, result4, result5;
1070
1357
  var pos0, pos1;
1071
1358
 
1072
- pos0 = pos;
1073
- pos1 = pos;
1074
- if (input.charCodeAt(pos) === 123) {
1359
+ pos0 = clone(pos);
1360
+ pos1 = clone(pos);
1361
+ if (input.charCodeAt(pos.offset) === 123) {
1075
1362
  result0 = "{";
1076
- pos++;
1363
+ advance(pos, 1);
1077
1364
  } else {
1078
1365
  result0 = null;
1079
1366
  if (reportFailures === 0) {
@@ -1088,9 +1375,9 @@ smalltalk.parser = (function(){
1088
1375
  if (result2 !== null) {
1089
1376
  result3 = parse_ws();
1090
1377
  if (result3 !== null) {
1091
- if (input.charCodeAt(pos) === 46) {
1378
+ if (input.charCodeAt(pos.offset) === 46) {
1092
1379
  result4 = ".";
1093
- pos++;
1380
+ advance(pos, 1);
1094
1381
  } else {
1095
1382
  result4 = null;
1096
1383
  if (reportFailures === 0) {
@@ -1099,9 +1386,9 @@ smalltalk.parser = (function(){
1099
1386
  }
1100
1387
  result4 = result4 !== null ? result4 : "";
1101
1388
  if (result4 !== null) {
1102
- if (input.charCodeAt(pos) === 125) {
1389
+ if (input.charCodeAt(pos.offset) === 125) {
1103
1390
  result5 = "}";
1104
- pos++;
1391
+ advance(pos, 1);
1105
1392
  } else {
1106
1393
  result5 = null;
1107
1394
  if (reportFailures === 0) {
@@ -1112,49 +1399,61 @@ smalltalk.parser = (function(){
1112
1399
  result0 = [result0, result1, result2, result3, result4, result5];
1113
1400
  } else {
1114
1401
  result0 = null;
1115
- pos = pos1;
1402
+ pos = clone(pos1);
1116
1403
  }
1117
1404
  } else {
1118
1405
  result0 = null;
1119
- pos = pos1;
1406
+ pos = clone(pos1);
1120
1407
  }
1121
1408
  } else {
1122
1409
  result0 = null;
1123
- pos = pos1;
1410
+ pos = clone(pos1);
1124
1411
  }
1125
1412
  } else {
1126
1413
  result0 = null;
1127
- pos = pos1;
1414
+ pos = clone(pos1);
1128
1415
  }
1129
1416
  } else {
1130
1417
  result0 = null;
1131
- pos = pos1;
1418
+ pos = clone(pos1);
1132
1419
  }
1133
1420
  } else {
1134
1421
  result0 = null;
1135
- pos = pos1;
1422
+ pos = clone(pos1);
1136
1423
  }
1137
1424
  if (result0 !== null) {
1138
- result0 = (function(offset, expressions) {
1139
- return smalltalk.DynamicArrayNode._new()
1140
- ._nodes_(expressions)
1141
- })(pos0, result0[2]);
1425
+ result0 = (function(offset, line, column, expressions) {
1426
+ return smalltalk.DynamicArrayNode._new()
1427
+ ._nodes_(expressions)
1428
+ })(pos0.offset, pos0.line, pos0.column, result0[2]);
1142
1429
  }
1143
1430
  if (result0 === null) {
1144
- pos = pos0;
1431
+ pos = clone(pos0);
1145
1432
  }
1433
+
1434
+ cache[cacheKey] = {
1435
+ nextPos: clone(pos),
1436
+ result: result0
1437
+ };
1146
1438
  return result0;
1147
1439
  }
1148
1440
 
1149
1441
  function parse_dynamicDictionary() {
1442
+ var cacheKey = "dynamicDictionary@" + pos.offset;
1443
+ var cachedResult = cache[cacheKey];
1444
+ if (cachedResult) {
1445
+ pos = clone(cachedResult.nextPos);
1446
+ return cachedResult.result;
1447
+ }
1448
+
1150
1449
  var result0, result1, result2, result3, result4;
1151
1450
  var pos0, pos1;
1152
1451
 
1153
- pos0 = pos;
1154
- pos1 = pos;
1155
- if (input.substr(pos, 2) === "#{") {
1452
+ pos0 = clone(pos);
1453
+ pos1 = clone(pos);
1454
+ if (input.substr(pos.offset, 2) === "#{") {
1156
1455
  result0 = "#{";
1157
- pos += 2;
1456
+ advance(pos, 2);
1158
1457
  } else {
1159
1458
  result0 = null;
1160
1459
  if (reportFailures === 0) {
@@ -1169,9 +1468,9 @@ smalltalk.parser = (function(){
1169
1468
  if (result2 !== null) {
1170
1469
  result3 = parse_ws();
1171
1470
  if (result3 !== null) {
1172
- if (input.charCodeAt(pos) === 125) {
1471
+ if (input.charCodeAt(pos.offset) === 125) {
1173
1472
  result4 = "}";
1174
- pos++;
1473
+ advance(pos, 1);
1175
1474
  } else {
1176
1475
  result4 = null;
1177
1476
  if (reportFailures === 0) {
@@ -1182,45 +1481,57 @@ smalltalk.parser = (function(){
1182
1481
  result0 = [result0, result1, result2, result3, result4];
1183
1482
  } else {
1184
1483
  result0 = null;
1185
- pos = pos1;
1484
+ pos = clone(pos1);
1186
1485
  }
1187
1486
  } else {
1188
1487
  result0 = null;
1189
- pos = pos1;
1488
+ pos = clone(pos1);
1190
1489
  }
1191
1490
  } else {
1192
1491
  result0 = null;
1193
- pos = pos1;
1492
+ pos = clone(pos1);
1194
1493
  }
1195
1494
  } else {
1196
1495
  result0 = null;
1197
- pos = pos1;
1496
+ pos = clone(pos1);
1198
1497
  }
1199
1498
  } else {
1200
1499
  result0 = null;
1201
- pos = pos1;
1500
+ pos = clone(pos1);
1202
1501
  }
1203
1502
  if (result0 !== null) {
1204
- result0 = (function(offset, expressions) {
1205
- return smalltalk.DynamicDictionaryNode._new()
1206
- ._nodes_(expressions)
1207
- })(pos0, result0[2]);
1503
+ result0 = (function(offset, line, column, expressions) {
1504
+ return smalltalk.DynamicDictionaryNode._new()
1505
+ ._nodes_(expressions)
1506
+ })(pos0.offset, pos0.line, pos0.column, result0[2]);
1208
1507
  }
1209
1508
  if (result0 === null) {
1210
- pos = pos0;
1509
+ pos = clone(pos0);
1211
1510
  }
1511
+
1512
+ cache[cacheKey] = {
1513
+ nextPos: clone(pos),
1514
+ result: result0
1515
+ };
1212
1516
  return result0;
1213
1517
  }
1214
1518
 
1215
1519
  function parse_pseudoVariable() {
1520
+ var cacheKey = "pseudoVariable@" + pos.offset;
1521
+ var cachedResult = cache[cacheKey];
1522
+ if (cachedResult) {
1523
+ pos = clone(cachedResult.nextPos);
1524
+ return cachedResult.result;
1525
+ }
1526
+
1216
1527
  var result0;
1217
1528
  var pos0, pos1;
1218
1529
 
1219
- pos0 = pos;
1220
- pos1 = pos;
1221
- if (input.substr(pos, 4) === "true") {
1530
+ pos0 = clone(pos);
1531
+ pos1 = clone(pos);
1532
+ if (input.substr(pos.offset, 4) === "true") {
1222
1533
  result0 = "true";
1223
- pos += 4;
1534
+ advance(pos, 4);
1224
1535
  } else {
1225
1536
  result0 = null;
1226
1537
  if (reportFailures === 0) {
@@ -1228,16 +1539,16 @@ smalltalk.parser = (function(){
1228
1539
  }
1229
1540
  }
1230
1541
  if (result0 !== null) {
1231
- result0 = (function(offset) {return true})(pos1);
1542
+ result0 = (function(offset, line, column) {return true})(pos1.offset, pos1.line, pos1.column);
1232
1543
  }
1233
1544
  if (result0 === null) {
1234
- pos = pos1;
1545
+ pos = clone(pos1);
1235
1546
  }
1236
1547
  if (result0 === null) {
1237
- pos1 = pos;
1238
- if (input.substr(pos, 5) === "false") {
1548
+ pos1 = clone(pos);
1549
+ if (input.substr(pos.offset, 5) === "false") {
1239
1550
  result0 = "false";
1240
- pos += 5;
1551
+ advance(pos, 5);
1241
1552
  } else {
1242
1553
  result0 = null;
1243
1554
  if (reportFailures === 0) {
@@ -1245,16 +1556,16 @@ smalltalk.parser = (function(){
1245
1556
  }
1246
1557
  }
1247
1558
  if (result0 !== null) {
1248
- result0 = (function(offset) {return false})(pos1);
1559
+ result0 = (function(offset, line, column) {return false})(pos1.offset, pos1.line, pos1.column);
1249
1560
  }
1250
1561
  if (result0 === null) {
1251
- pos = pos1;
1562
+ pos = clone(pos1);
1252
1563
  }
1253
1564
  if (result0 === null) {
1254
- pos1 = pos;
1255
- if (input.substr(pos, 3) === "nil") {
1565
+ pos1 = clone(pos);
1566
+ if (input.substr(pos.offset, 3) === "nil") {
1256
1567
  result0 = "nil";
1257
- pos += 3;
1568
+ advance(pos, 3);
1258
1569
  } else {
1259
1570
  result0 = null;
1260
1571
  if (reportFailures === 0) {
@@ -1262,25 +1573,38 @@ smalltalk.parser = (function(){
1262
1573
  }
1263
1574
  }
1264
1575
  if (result0 !== null) {
1265
- result0 = (function(offset) {return nil})(pos1);
1576
+ result0 = (function(offset, line, column) {return nil})(pos1.offset, pos1.line, pos1.column);
1266
1577
  }
1267
1578
  if (result0 === null) {
1268
- pos = pos1;
1579
+ pos = clone(pos1);
1269
1580
  }
1270
1581
  }
1271
1582
  }
1272
1583
  if (result0 !== null) {
1273
- result0 = (function(offset, val) {
1274
- return smalltalk.ValueNode._new()._value_(val)
1275
- })(pos0, result0);
1584
+ result0 = (function(offset, line, column, val) {
1585
+ return smalltalk.ValueNode._new()
1586
+ ._value_(val)
1587
+ })(pos0.offset, pos0.line, pos0.column, result0);
1276
1588
  }
1277
1589
  if (result0 === null) {
1278
- pos = pos0;
1590
+ pos = clone(pos0);
1279
1591
  }
1592
+
1593
+ cache[cacheKey] = {
1594
+ nextPos: clone(pos),
1595
+ result: result0
1596
+ };
1280
1597
  return result0;
1281
1598
  }
1282
1599
 
1283
1600
  function parse_literal() {
1601
+ var cacheKey = "literal@" + pos.offset;
1602
+ var cachedResult = cache[cacheKey];
1603
+ if (cachedResult) {
1604
+ pos = clone(cachedResult.nextPos);
1605
+ return cachedResult.result;
1606
+ }
1607
+
1284
1608
  var result0;
1285
1609
 
1286
1610
  result0 = parse_pseudoVariable();
@@ -1305,61 +1629,109 @@ smalltalk.parser = (function(){
1305
1629
  }
1306
1630
  }
1307
1631
  }
1632
+
1633
+ cache[cacheKey] = {
1634
+ nextPos: clone(pos),
1635
+ result: result0
1636
+ };
1308
1637
  return result0;
1309
1638
  }
1310
1639
 
1311
1640
  function parse_variable() {
1641
+ var cacheKey = "variable@" + pos.offset;
1642
+ var cachedResult = cache[cacheKey];
1643
+ if (cachedResult) {
1644
+ pos = clone(cachedResult.nextPos);
1645
+ return cachedResult.result;
1646
+ }
1647
+
1312
1648
  var result0;
1313
1649
  var pos0;
1314
1650
 
1315
- pos0 = pos;
1651
+ pos0 = clone(pos);
1316
1652
  result0 = parse_varIdentifier();
1317
1653
  if (result0 !== null) {
1318
- result0 = (function(offset, identifier) {
1319
- return smalltalk.VariableNode._new()
1320
- ._value_(identifier)
1321
- })(pos0, result0);
1654
+ result0 = (function(offset, line, column, identifier) {
1655
+ return smalltalk.VariableNode._new()
1656
+ ._value_(identifier)
1657
+ })(pos0.offset, pos0.line, pos0.column, result0);
1322
1658
  }
1323
1659
  if (result0 === null) {
1324
- pos = pos0;
1660
+ pos = clone(pos0);
1325
1661
  }
1662
+
1663
+ cache[cacheKey] = {
1664
+ nextPos: clone(pos),
1665
+ result: result0
1666
+ };
1326
1667
  return result0;
1327
1668
  }
1328
1669
 
1329
1670
  function parse_classReference() {
1671
+ var cacheKey = "classReference@" + pos.offset;
1672
+ var cachedResult = cache[cacheKey];
1673
+ if (cachedResult) {
1674
+ pos = clone(cachedResult.nextPos);
1675
+ return cachedResult.result;
1676
+ }
1677
+
1330
1678
  var result0;
1331
1679
  var pos0;
1332
1680
 
1333
- pos0 = pos;
1681
+ pos0 = clone(pos);
1334
1682
  result0 = parse_className();
1335
1683
  if (result0 !== null) {
1336
- result0 = (function(offset, className) {
1337
- return smalltalk.ClassReferenceNode._new()
1338
- ._value_(className)
1339
- })(pos0, result0);
1684
+ result0 = (function(offset, line, column, className) {
1685
+ return smalltalk.ClassReferenceNode._new()
1686
+ ._value_(className)
1687
+ })(pos0.offset, pos0.line, pos0.column, result0);
1340
1688
  }
1341
1689
  if (result0 === null) {
1342
- pos = pos0;
1690
+ pos = clone(pos0);
1343
1691
  }
1692
+
1693
+ cache[cacheKey] = {
1694
+ nextPos: clone(pos),
1695
+ result: result0
1696
+ };
1344
1697
  return result0;
1345
1698
  }
1346
1699
 
1347
1700
  function parse_reference() {
1701
+ var cacheKey = "reference@" + pos.offset;
1702
+ var cachedResult = cache[cacheKey];
1703
+ if (cachedResult) {
1704
+ pos = clone(cachedResult.nextPos);
1705
+ return cachedResult.result;
1706
+ }
1707
+
1348
1708
  var result0;
1349
1709
 
1350
1710
  result0 = parse_variable();
1351
1711
  if (result0 === null) {
1352
1712
  result0 = parse_classReference();
1353
1713
  }
1714
+
1715
+ cache[cacheKey] = {
1716
+ nextPos: clone(pos),
1717
+ result: result0
1718
+ };
1354
1719
  return result0;
1355
1720
  }
1356
1721
 
1357
1722
  function parse_keywordPair() {
1723
+ var cacheKey = "keywordPair@" + pos.offset;
1724
+ var cachedResult = cache[cacheKey];
1725
+ if (cachedResult) {
1726
+ pos = clone(cachedResult.nextPos);
1727
+ return cachedResult.result;
1728
+ }
1729
+
1358
1730
  var result0, result1, result2, result3;
1359
1731
  var pos0, pos1;
1360
1732
 
1361
- pos0 = pos;
1362
- pos1 = pos;
1733
+ pos0 = clone(pos);
1734
+ pos1 = clone(pos);
1363
1735
  result0 = parse_keyword();
1364
1736
  if (result0 !== null) {
1365
1737
  result1 = parse_ws();
@@ -1371,37 +1743,49 @@ smalltalk.parser = (function(){
1371
1743
  result0 = [result0, result1, result2, result3];
1372
1744
  } else {
1373
1745
  result0 = null;
1374
- pos = pos1;
1746
+ pos = clone(pos1);
1375
1747
  }
1376
1748
  } else {
1377
1749
  result0 = null;
1378
- pos = pos1;
1750
+ pos = clone(pos1);
1379
1751
  }
1380
1752
  } else {
1381
1753
  result0 = null;
1382
- pos = pos1;
1754
+ pos = clone(pos1);
1383
1755
  }
1384
1756
  } else {
1385
1757
  result0 = null;
1386
- pos = pos1;
1758
+ pos = clone(pos1);
1387
1759
  }
1388
1760
  if (result0 !== null) {
1389
- result0 = (function(offset, key, arg) {return {key:key, arg: arg}})(pos0, result0[0], result0[2]);
1761
+ result0 = (function(offset, line, column, key, arg) {return {key:key, arg: arg}})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
1390
1762
  }
1391
1763
  if (result0 === null) {
1392
- pos = pos0;
1764
+ pos = clone(pos0);
1393
1765
  }
1766
+
1767
+ cache[cacheKey] = {
1768
+ nextPos: clone(pos),
1769
+ result: result0
1770
+ };
1394
1771
  return result0;
1395
1772
  }
1396
1773
 
1397
1774
  function parse_binarySelector() {
1775
+ var cacheKey = "binarySelector@" + pos.offset;
1776
+ var cachedResult = cache[cacheKey];
1777
+ if (cachedResult) {
1778
+ pos = clone(cachedResult.nextPos);
1779
+ return cachedResult.result;
1780
+ }
1781
+
1398
1782
  var result0, result1;
1399
1783
  var pos0;
1400
1784
 
1401
- pos0 = pos;
1402
- if (/^[\\+*\/=><,@%~|&\-]/.test(input.charAt(pos))) {
1403
- result1 = input.charAt(pos);
1404
- pos++;
1785
+ pos0 = clone(pos);
1786
+ if (/^[\\+*\/=><,@%~|&\-]/.test(input.charAt(pos.offset))) {
1787
+ result1 = input.charAt(pos.offset);
1788
+ advance(pos, 1);
1405
1789
  } else {
1406
1790
  result1 = null;
1407
1791
  if (reportFailures === 0) {
@@ -1412,9 +1796,9 @@ smalltalk.parser = (function(){
1412
1796
  result0 = [];
1413
1797
  while (result1 !== null) {
1414
1798
  result0.push(result1);
1415
- if (/^[\\+*\/=><,@%~|&\-]/.test(input.charAt(pos))) {
1416
- result1 = input.charAt(pos);
1417
- pos++;
1799
+ if (/^[\\+*\/=><,@%~|&\-]/.test(input.charAt(pos.offset))) {
1800
+ result1 = input.charAt(pos.offset);
1801
+ advance(pos, 1);
1418
1802
  } else {
1419
1803
  result1 = null;
1420
1804
  if (reportFailures === 0) {
@@ -1426,21 +1810,33 @@ smalltalk.parser = (function(){
1426
1810
  result0 = null;
1427
1811
  }
1428
1812
  if (result0 !== null) {
1429
- result0 = (function(offset, bin) {return bin.join("").replace(/\\/g, '\\\\')})(pos0, result0);
1813
+ result0 = (function(offset, line, column, bin) {return bin.join("")})(pos0.offset, pos0.line, pos0.column, result0);
1430
1814
  }
1431
1815
  if (result0 === null) {
1432
- pos = pos0;
1816
+ pos = clone(pos0);
1433
1817
  }
1818
+
1819
+ cache[cacheKey] = {
1820
+ nextPos: clone(pos),
1821
+ result: result0
1822
+ };
1434
1823
  return result0;
1435
1824
  }
1436
1825
 
1437
1826
  function parse_keywordPattern() {
1827
+ var cacheKey = "keywordPattern@" + pos.offset;
1828
+ var cachedResult = cache[cacheKey];
1829
+ if (cachedResult) {
1830
+ pos = clone(cachedResult.nextPos);
1831
+ return cachedResult.result;
1832
+ }
1833
+
1438
1834
  var result0, result1, result2, result3, result4;
1439
1835
  var pos0, pos1, pos2;
1440
1836
 
1441
- pos0 = pos;
1442
- pos1 = pos;
1443
- pos2 = pos;
1837
+ pos0 = clone(pos);
1838
+ pos1 = clone(pos);
1839
+ pos2 = clone(pos);
1444
1840
  result1 = parse_ws();
1445
1841
  if (result1 !== null) {
1446
1842
  result2 = parse_keyword();
@@ -1452,32 +1848,32 @@ smalltalk.parser = (function(){
1452
1848
  result1 = [result1, result2, result3, result4];
1453
1849
  } else {
1454
1850
  result1 = null;
1455
- pos = pos2;
1851
+ pos = clone(pos2);
1456
1852
  }
1457
1853
  } else {
1458
1854
  result1 = null;
1459
- pos = pos2;
1855
+ pos = clone(pos2);
1460
1856
  }
1461
1857
  } else {
1462
1858
  result1 = null;
1463
- pos = pos2;
1859
+ pos = clone(pos2);
1464
1860
  }
1465
1861
  } else {
1466
1862
  result1 = null;
1467
- pos = pos2;
1863
+ pos = clone(pos2);
1468
1864
  }
1469
1865
  if (result1 !== null) {
1470
- result1 = (function(offset, key, arg) {return {key:key, arg: arg}})(pos1, result1[1], result1[3]);
1866
+ result1 = (function(offset, line, column, key, arg) {return {key:key, arg: arg}})(pos1.offset, pos1.line, pos1.column, result1[1], result1[3]);
1471
1867
  }
1472
1868
  if (result1 === null) {
1473
- pos = pos1;
1869
+ pos = clone(pos1);
1474
1870
  }
1475
1871
  if (result1 !== null) {
1476
1872
  result0 = [];
1477
1873
  while (result1 !== null) {
1478
1874
  result0.push(result1);
1479
- pos1 = pos;
1480
- pos2 = pos;
1875
+ pos1 = clone(pos);
1876
+ pos2 = clone(pos);
1481
1877
  result1 = parse_ws();
1482
1878
  if (result1 !== null) {
1483
1879
  result2 = parse_keyword();
@@ -1489,33 +1885,33 @@ smalltalk.parser = (function(){
1489
1885
  result1 = [result1, result2, result3, result4];
1490
1886
  } else {
1491
1887
  result1 = null;
1492
- pos = pos2;
1888
+ pos = clone(pos2);
1493
1889
  }
1494
1890
  } else {
1495
1891
  result1 = null;
1496
- pos = pos2;
1892
+ pos = clone(pos2);
1497
1893
  }
1498
1894
  } else {
1499
1895
  result1 = null;
1500
- pos = pos2;
1896
+ pos = clone(pos2);
1501
1897
  }
1502
1898
  } else {
1503
1899
  result1 = null;
1504
- pos = pos2;
1900
+ pos = clone(pos2);
1505
1901
  }
1506
1902
  if (result1 !== null) {
1507
- result1 = (function(offset, key, arg) {return {key:key, arg: arg}})(pos1, result1[1], result1[3]);
1903
+ result1 = (function(offset, line, column, key, arg) {return {key:key, arg: arg}})(pos1.offset, pos1.line, pos1.column, result1[1], result1[3]);
1508
1904
  }
1509
1905
  if (result1 === null) {
1510
- pos = pos1;
1906
+ pos = clone(pos1);
1511
1907
  }
1512
1908
  }
1513
1909
  } else {
1514
1910
  result0 = null;
1515
1911
  }
1516
1912
  if (result0 !== null) {
1517
- result0 = (function(offset, pairs) {
1518
- var keywords = [];
1913
+ result0 = (function(offset, line, column, pairs) {
1914
+ var keywords = [];
1519
1915
  var params = [];
1520
1916
  for(var i=0;i<pairs.length;i++){
1521
1917
  keywords.push(pairs[i].key);
@@ -1523,21 +1919,33 @@ smalltalk.parser = (function(){
1523
1919
  for(var i=0;i<pairs.length;i++){
1524
1920
  params.push(pairs[i].arg);
1525
1921
  }
1526
- return [keywords.join(""), params]
1527
- })(pos0, result0);
1922
+ return [keywords.join(""), params]
1923
+ })(pos0.offset, pos0.line, pos0.column, result0);
1528
1924
  }
1529
1925
  if (result0 === null) {
1530
- pos = pos0;
1926
+ pos = clone(pos0);
1531
1927
  }
1928
+
1929
+ cache[cacheKey] = {
1930
+ nextPos: clone(pos),
1931
+ result: result0
1932
+ };
1532
1933
  return result0;
1533
1934
  }
1534
1935
 
1535
1936
  function parse_binaryPattern() {
1937
+ var cacheKey = "binaryPattern@" + pos.offset;
1938
+ var cachedResult = cache[cacheKey];
1939
+ if (cachedResult) {
1940
+ pos = clone(cachedResult.nextPos);
1941
+ return cachedResult.result;
1942
+ }
1943
+
1536
1944
  var result0, result1, result2, result3;
1537
1945
  var pos0, pos1;
1538
1946
 
1539
- pos0 = pos;
1540
- pos1 = pos;
1947
+ pos0 = clone(pos);
1948
+ pos1 = clone(pos);
1541
1949
  result0 = parse_ws();
1542
1950
  if (result0 !== null) {
1543
1951
  result1 = parse_binarySelector();
@@ -1549,35 +1957,47 @@ smalltalk.parser = (function(){
1549
1957
  result0 = [result0, result1, result2, result3];
1550
1958
  } else {
1551
1959
  result0 = null;
1552
- pos = pos1;
1960
+ pos = clone(pos1);
1553
1961
  }
1554
1962
  } else {
1555
1963
  result0 = null;
1556
- pos = pos1;
1964
+ pos = clone(pos1);
1557
1965
  }
1558
1966
  } else {
1559
1967
  result0 = null;
1560
- pos = pos1;
1968
+ pos = clone(pos1);
1561
1969
  }
1562
1970
  } else {
1563
1971
  result0 = null;
1564
- pos = pos1;
1972
+ pos = clone(pos1);
1565
1973
  }
1566
1974
  if (result0 !== null) {
1567
- result0 = (function(offset, selector, arg) {return [selector, [arg]]})(pos0, result0[1], result0[3]);
1975
+ result0 = (function(offset, line, column, selector, arg) {return [selector, [arg]]})(pos0.offset, pos0.line, pos0.column, result0[1], result0[3]);
1568
1976
  }
1569
1977
  if (result0 === null) {
1570
- pos = pos0;
1978
+ pos = clone(pos0);
1571
1979
  }
1980
+
1981
+ cache[cacheKey] = {
1982
+ nextPos: clone(pos),
1983
+ result: result0
1984
+ };
1572
1985
  return result0;
1573
1986
  }
1574
1987
 
1575
1988
  function parse_unaryPattern() {
1989
+ var cacheKey = "unaryPattern@" + pos.offset;
1990
+ var cachedResult = cache[cacheKey];
1991
+ if (cachedResult) {
1992
+ pos = clone(cachedResult.nextPos);
1993
+ return cachedResult.result;
1994
+ }
1995
+
1576
1996
  var result0, result1;
1577
1997
  var pos0, pos1;
1578
1998
 
1579
- pos0 = pos;
1580
- pos1 = pos;
1999
+ pos0 = clone(pos);
2000
+ pos1 = clone(pos);
1581
2001
  result0 = parse_ws();
1582
2002
  if (result0 !== null) {
1583
2003
  result1 = parse_identifier();
@@ -1585,22 +2005,34 @@ smalltalk.parser = (function(){
1585
2005
  result0 = [result0, result1];
1586
2006
  } else {
1587
2007
  result0 = null;
1588
- pos = pos1;
2008
+ pos = clone(pos1);
1589
2009
  }
1590
2010
  } else {
1591
2011
  result0 = null;
1592
- pos = pos1;
2012
+ pos = clone(pos1);
1593
2013
  }
1594
2014
  if (result0 !== null) {
1595
- result0 = (function(offset, selector) {return [selector, []]})(pos0, result0[1]);
2015
+ result0 = (function(offset, line, column, selector) {return [selector, []]})(pos0.offset, pos0.line, pos0.column, result0[1]);
1596
2016
  }
1597
2017
  if (result0 === null) {
1598
- pos = pos0;
2018
+ pos = clone(pos0);
1599
2019
  }
2020
+
2021
+ cache[cacheKey] = {
2022
+ nextPos: clone(pos),
2023
+ result: result0
2024
+ };
1600
2025
  return result0;
1601
2026
  }
1602
2027
 
1603
2028
  function parse_expression() {
2029
+ var cacheKey = "expression@" + pos.offset;
2030
+ var cachedResult = cache[cacheKey];
2031
+ if (cachedResult) {
2032
+ pos = clone(cachedResult.nextPos);
2033
+ return cachedResult.result;
2034
+ }
2035
+
1604
2036
  var result0;
1605
2037
 
1606
2038
  result0 = parse_assignment();
@@ -1610,26 +2042,35 @@ smalltalk.parser = (function(){
1610
2042
  result0 = parse_keywordSend();
1611
2043
  if (result0 === null) {
1612
2044
  result0 = parse_binarySend();
1613
- if (result0 === null) {
1614
- result0 = parse_jsStatement();
1615
- }
1616
2045
  }
1617
2046
  }
1618
2047
  }
2048
+
2049
+ cache[cacheKey] = {
2050
+ nextPos: clone(pos),
2051
+ result: result0
2052
+ };
1619
2053
  return result0;
1620
2054
  }
1621
2055
 
1622
2056
  function parse_expressionList() {
2057
+ var cacheKey = "expressionList@" + pos.offset;
2058
+ var cachedResult = cache[cacheKey];
2059
+ if (cachedResult) {
2060
+ pos = clone(cachedResult.nextPos);
2061
+ return cachedResult.result;
2062
+ }
2063
+
1623
2064
  var result0, result1, result2, result3;
1624
2065
  var pos0, pos1;
1625
2066
 
1626
- pos0 = pos;
1627
- pos1 = pos;
2067
+ pos0 = clone(pos);
2068
+ pos1 = clone(pos);
1628
2069
  result0 = parse_ws();
1629
2070
  if (result0 !== null) {
1630
- if (input.charCodeAt(pos) === 46) {
2071
+ if (input.charCodeAt(pos.offset) === 46) {
1631
2072
  result1 = ".";
1632
- pos++;
2073
+ advance(pos, 1);
1633
2074
  } else {
1634
2075
  result1 = null;
1635
2076
  if (reportFailures === 0) {
@@ -1644,35 +2085,47 @@ smalltalk.parser = (function(){
1644
2085
  result0 = [result0, result1, result2, result3];
1645
2086
  } else {
1646
2087
  result0 = null;
1647
- pos = pos1;
2088
+ pos = clone(pos1);
1648
2089
  }
1649
2090
  } else {
1650
2091
  result0 = null;
1651
- pos = pos1;
2092
+ pos = clone(pos1);
1652
2093
  }
1653
2094
  } else {
1654
2095
  result0 = null;
1655
- pos = pos1;
2096
+ pos = clone(pos1);
1656
2097
  }
1657
2098
  } else {
1658
2099
  result0 = null;
1659
- pos = pos1;
2100
+ pos = clone(pos1);
1660
2101
  }
1661
2102
  if (result0 !== null) {
1662
- result0 = (function(offset, expression) {return expression})(pos0, result0[3]);
2103
+ result0 = (function(offset, line, column, expression) {return expression})(pos0.offset, pos0.line, pos0.column, result0[3]);
1663
2104
  }
1664
2105
  if (result0 === null) {
1665
- pos = pos0;
2106
+ pos = clone(pos0);
1666
2107
  }
2108
+
2109
+ cache[cacheKey] = {
2110
+ nextPos: clone(pos),
2111
+ result: result0
2112
+ };
1667
2113
  return result0;
1668
2114
  }
1669
2115
 
1670
2116
  function parse_expressions() {
2117
+ var cacheKey = "expressions@" + pos.offset;
2118
+ var cachedResult = cache[cacheKey];
2119
+ if (cachedResult) {
2120
+ pos = clone(cachedResult.nextPos);
2121
+ return cachedResult.result;
2122
+ }
2123
+
1671
2124
  var result0, result1, result2;
1672
2125
  var pos0, pos1;
1673
2126
 
1674
- pos0 = pos;
1675
- pos1 = pos;
2127
+ pos0 = clone(pos);
2128
+ pos1 = clone(pos);
1676
2129
  result0 = parse_expression();
1677
2130
  if (result0 !== null) {
1678
2131
  result1 = [];
@@ -1685,40 +2138,52 @@ smalltalk.parser = (function(){
1685
2138
  result0 = [result0, result1];
1686
2139
  } else {
1687
2140
  result0 = null;
1688
- pos = pos1;
2141
+ pos = clone(pos1);
1689
2142
  }
1690
2143
  } else {
1691
2144
  result0 = null;
1692
- pos = pos1;
2145
+ pos = clone(pos1);
1693
2146
  }
1694
2147
  if (result0 !== null) {
1695
- result0 = (function(offset, first, others) {
1696
- var result = [first];
1697
- for(var i=0;i<others.length;i++) {
1698
- result.push(others[i]);
1699
- }
1700
- return result;
1701
- })(pos0, result0[0], result0[1]);
2148
+ result0 = (function(offset, line, column, first, others) {
2149
+ var result = [first];
2150
+ for(var i=0;i<others.length;i++) {
2151
+ result.push(others[i]);
2152
+ }
2153
+ return result;
2154
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
1702
2155
  }
1703
2156
  if (result0 === null) {
1704
- pos = pos0;
2157
+ pos = clone(pos0);
1705
2158
  }
2159
+
2160
+ cache[cacheKey] = {
2161
+ nextPos: clone(pos),
2162
+ result: result0
2163
+ };
1706
2164
  return result0;
1707
2165
  }
1708
2166
 
1709
2167
  function parse_assignment() {
2168
+ var cacheKey = "assignment@" + pos.offset;
2169
+ var cachedResult = cache[cacheKey];
2170
+ if (cachedResult) {
2171
+ pos = clone(cachedResult.nextPos);
2172
+ return cachedResult.result;
2173
+ }
2174
+
1710
2175
  var result0, result1, result2, result3, result4;
1711
2176
  var pos0, pos1;
1712
2177
 
1713
- pos0 = pos;
1714
- pos1 = pos;
2178
+ pos0 = clone(pos);
2179
+ pos1 = clone(pos);
1715
2180
  result0 = parse_variable();
1716
2181
  if (result0 !== null) {
1717
2182
  result1 = parse_ws();
1718
2183
  if (result1 !== null) {
1719
- if (input.substr(pos, 2) === ":=") {
2184
+ if (input.substr(pos.offset, 2) === ":=") {
1720
2185
  result2 = ":=";
1721
- pos += 2;
2186
+ advance(pos, 2);
1722
2187
  } else {
1723
2188
  result2 = null;
1724
2189
  if (reportFailures === 0) {
@@ -1733,46 +2198,58 @@ smalltalk.parser = (function(){
1733
2198
  result0 = [result0, result1, result2, result3, result4];
1734
2199
  } else {
1735
2200
  result0 = null;
1736
- pos = pos1;
2201
+ pos = clone(pos1);
1737
2202
  }
1738
2203
  } else {
1739
2204
  result0 = null;
1740
- pos = pos1;
2205
+ pos = clone(pos1);
1741
2206
  }
1742
2207
  } else {
1743
2208
  result0 = null;
1744
- pos = pos1;
2209
+ pos = clone(pos1);
1745
2210
  }
1746
2211
  } else {
1747
2212
  result0 = null;
1748
- pos = pos1;
2213
+ pos = clone(pos1);
1749
2214
  }
1750
2215
  } else {
1751
2216
  result0 = null;
1752
- pos = pos1;
2217
+ pos = clone(pos1);
1753
2218
  }
1754
2219
  if (result0 !== null) {
1755
- result0 = (function(offset, variable, expression) {
1756
- return smalltalk.AssignmentNode._new()
1757
- ._left_(variable)
1758
- ._right_(expression)
1759
- })(pos0, result0[0], result0[4]);
2220
+ result0 = (function(offset, line, column, variable, expression) {
2221
+ return smalltalk.AssignmentNode._new()
2222
+ ._left_(variable)
2223
+ ._right_(expression)
2224
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[4]);
1760
2225
  }
1761
2226
  if (result0 === null) {
1762
- pos = pos0;
2227
+ pos = clone(pos0);
1763
2228
  }
2229
+
2230
+ cache[cacheKey] = {
2231
+ nextPos: clone(pos),
2232
+ result: result0
2233
+ };
1764
2234
  return result0;
1765
2235
  }
1766
2236
 
1767
2237
  function parse_ret() {
2238
+ var cacheKey = "ret@" + pos.offset;
2239
+ var cachedResult = cache[cacheKey];
2240
+ if (cachedResult) {
2241
+ pos = clone(cachedResult.nextPos);
2242
+ return cachedResult.result;
2243
+ }
2244
+
1768
2245
  var result0, result1, result2, result3, result4;
1769
2246
  var pos0, pos1;
1770
2247
 
1771
- pos0 = pos;
1772
- pos1 = pos;
1773
- if (input.charCodeAt(pos) === 94) {
2248
+ pos0 = clone(pos);
2249
+ pos1 = clone(pos);
2250
+ if (input.charCodeAt(pos.offset) === 94) {
1774
2251
  result0 = "^";
1775
- pos++;
2252
+ advance(pos, 1);
1776
2253
  } else {
1777
2254
  result0 = null;
1778
2255
  if (reportFailures === 0) {
@@ -1786,9 +2263,9 @@ smalltalk.parser = (function(){
1786
2263
  if (result2 !== null) {
1787
2264
  result3 = parse_ws();
1788
2265
  if (result3 !== null) {
1789
- if (input.charCodeAt(pos) === 46) {
2266
+ if (input.charCodeAt(pos.offset) === 46) {
1790
2267
  result4 = ".";
1791
- pos++;
2268
+ advance(pos, 1);
1792
2269
  } else {
1793
2270
  result4 = null;
1794
2271
  if (reportFailures === 0) {
@@ -1800,45 +2277,57 @@ smalltalk.parser = (function(){
1800
2277
  result0 = [result0, result1, result2, result3, result4];
1801
2278
  } else {
1802
2279
  result0 = null;
1803
- pos = pos1;
2280
+ pos = clone(pos1);
1804
2281
  }
1805
2282
  } else {
1806
2283
  result0 = null;
1807
- pos = pos1;
2284
+ pos = clone(pos1);
1808
2285
  }
1809
2286
  } else {
1810
2287
  result0 = null;
1811
- pos = pos1;
2288
+ pos = clone(pos1);
1812
2289
  }
1813
2290
  } else {
1814
2291
  result0 = null;
1815
- pos = pos1;
2292
+ pos = clone(pos1);
1816
2293
  }
1817
2294
  } else {
1818
2295
  result0 = null;
1819
- pos = pos1;
2296
+ pos = clone(pos1);
1820
2297
  }
1821
2298
  if (result0 !== null) {
1822
- result0 = (function(offset, expression) {
1823
- return smalltalk.ReturnNode._new()
1824
- ._nodes_([expression])
1825
- })(pos0, result0[2]);
2299
+ result0 = (function(offset, line, column, expression) {
2300
+ return smalltalk.ReturnNode._new()
2301
+ ._nodes_([expression])
2302
+ })(pos0.offset, pos0.line, pos0.column, result0[2]);
1826
2303
  }
1827
2304
  if (result0 === null) {
1828
- pos = pos0;
2305
+ pos = clone(pos0);
1829
2306
  }
2307
+
2308
+ cache[cacheKey] = {
2309
+ nextPos: clone(pos),
2310
+ result: result0
2311
+ };
1830
2312
  return result0;
1831
2313
  }
1832
2314
 
1833
2315
  function parse_temps() {
2316
+ var cacheKey = "temps@" + pos.offset;
2317
+ var cachedResult = cache[cacheKey];
2318
+ if (cachedResult) {
2319
+ pos = clone(cachedResult.nextPos);
2320
+ return cachedResult.result;
2321
+ }
2322
+
1834
2323
  var result0, result1, result2, result3, result4;
1835
2324
  var pos0, pos1, pos2, pos3;
1836
2325
 
1837
- pos0 = pos;
1838
- pos1 = pos;
1839
- if (input.charCodeAt(pos) === 124) {
2326
+ pos0 = clone(pos);
2327
+ pos1 = clone(pos);
2328
+ if (input.charCodeAt(pos.offset) === 124) {
1840
2329
  result0 = "|";
1841
- pos++;
2330
+ advance(pos, 1);
1842
2331
  } else {
1843
2332
  result0 = null;
1844
2333
  if (reportFailures === 0) {
@@ -1847,8 +2336,8 @@ smalltalk.parser = (function(){
1847
2336
  }
1848
2337
  if (result0 !== null) {
1849
2338
  result1 = [];
1850
- pos2 = pos;
1851
- pos3 = pos;
2339
+ pos2 = clone(pos);
2340
+ pos3 = clone(pos);
1852
2341
  result2 = parse_ws();
1853
2342
  if (result2 !== null) {
1854
2343
  result3 = parse_identifier();
@@ -1858,26 +2347,26 @@ smalltalk.parser = (function(){
1858
2347
  result2 = [result2, result3, result4];
1859
2348
  } else {
1860
2349
  result2 = null;
1861
- pos = pos3;
2350
+ pos = clone(pos3);
1862
2351
  }
1863
2352
  } else {
1864
2353
  result2 = null;
1865
- pos = pos3;
2354
+ pos = clone(pos3);
1866
2355
  }
1867
2356
  } else {
1868
2357
  result2 = null;
1869
- pos = pos3;
2358
+ pos = clone(pos3);
1870
2359
  }
1871
2360
  if (result2 !== null) {
1872
- result2 = (function(offset, variable) {return variable})(pos2, result2[1]);
2361
+ result2 = (function(offset, line, column, variable) {return variable})(pos2.offset, pos2.line, pos2.column, result2[1]);
1873
2362
  }
1874
2363
  if (result2 === null) {
1875
- pos = pos2;
2364
+ pos = clone(pos2);
1876
2365
  }
1877
2366
  while (result2 !== null) {
1878
2367
  result1.push(result2);
1879
- pos2 = pos;
1880
- pos3 = pos;
2368
+ pos2 = clone(pos);
2369
+ pos3 = clone(pos);
1881
2370
  result2 = parse_ws();
1882
2371
  if (result2 !== null) {
1883
2372
  result3 = parse_identifier();
@@ -1887,27 +2376,27 @@ smalltalk.parser = (function(){
1887
2376
  result2 = [result2, result3, result4];
1888
2377
  } else {
1889
2378
  result2 = null;
1890
- pos = pos3;
2379
+ pos = clone(pos3);
1891
2380
  }
1892
2381
  } else {
1893
2382
  result2 = null;
1894
- pos = pos3;
2383
+ pos = clone(pos3);
1895
2384
  }
1896
2385
  } else {
1897
2386
  result2 = null;
1898
- pos = pos3;
2387
+ pos = clone(pos3);
1899
2388
  }
1900
2389
  if (result2 !== null) {
1901
- result2 = (function(offset, variable) {return variable})(pos2, result2[1]);
2390
+ result2 = (function(offset, line, column, variable) {return variable})(pos2.offset, pos2.line, pos2.column, result2[1]);
1902
2391
  }
1903
2392
  if (result2 === null) {
1904
- pos = pos2;
2393
+ pos = clone(pos2);
1905
2394
  }
1906
2395
  }
1907
2396
  if (result1 !== null) {
1908
- if (input.charCodeAt(pos) === 124) {
2397
+ if (input.charCodeAt(pos.offset) === 124) {
1909
2398
  result2 = "|";
1910
- pos++;
2399
+ advance(pos, 1);
1911
2400
  } else {
1912
2401
  result2 = null;
1913
2402
  if (reportFailures === 0) {
@@ -1918,38 +2407,50 @@ smalltalk.parser = (function(){
1918
2407
  result0 = [result0, result1, result2];
1919
2408
  } else {
1920
2409
  result0 = null;
1921
- pos = pos1;
2410
+ pos = clone(pos1);
1922
2411
  }
1923
2412
  } else {
1924
2413
  result0 = null;
1925
- pos = pos1;
2414
+ pos = clone(pos1);
1926
2415
  }
1927
2416
  } else {
1928
2417
  result0 = null;
1929
- pos = pos1;
2418
+ pos = clone(pos1);
1930
2419
  }
1931
2420
  if (result0 !== null) {
1932
- result0 = (function(offset, vars) {return vars})(pos0, result0[1]);
2421
+ result0 = (function(offset, line, column, vars) {return vars})(pos0.offset, pos0.line, pos0.column, result0[1]);
1933
2422
  }
1934
2423
  if (result0 === null) {
1935
- pos = pos0;
2424
+ pos = clone(pos0);
1936
2425
  }
2426
+
2427
+ cache[cacheKey] = {
2428
+ nextPos: clone(pos),
2429
+ result: result0
2430
+ };
1937
2431
  return result0;
1938
2432
  }
1939
2433
 
1940
2434
  function parse_blockParamList() {
2435
+ var cacheKey = "blockParamList@" + pos.offset;
2436
+ var cachedResult = cache[cacheKey];
2437
+ if (cachedResult) {
2438
+ pos = clone(cachedResult.nextPos);
2439
+ return cachedResult.result;
2440
+ }
2441
+
1941
2442
  var result0, result1, result2, result3, result4;
1942
2443
  var pos0, pos1, pos2, pos3;
1943
2444
 
1944
- pos0 = pos;
1945
- pos1 = pos;
1946
- pos2 = pos;
1947
- pos3 = pos;
2445
+ pos0 = clone(pos);
2446
+ pos1 = clone(pos);
2447
+ pos2 = clone(pos);
2448
+ pos3 = clone(pos);
1948
2449
  result1 = parse_ws();
1949
2450
  if (result1 !== null) {
1950
- if (input.charCodeAt(pos) === 58) {
2451
+ if (input.charCodeAt(pos.offset) === 58) {
1951
2452
  result2 = ":";
1952
- pos++;
2453
+ advance(pos, 1);
1953
2454
  } else {
1954
2455
  result2 = null;
1955
2456
  if (reportFailures === 0) {
@@ -1964,37 +2465,37 @@ smalltalk.parser = (function(){
1964
2465
  result1 = [result1, result2, result3, result4];
1965
2466
  } else {
1966
2467
  result1 = null;
1967
- pos = pos3;
2468
+ pos = clone(pos3);
1968
2469
  }
1969
2470
  } else {
1970
2471
  result1 = null;
1971
- pos = pos3;
2472
+ pos = clone(pos3);
1972
2473
  }
1973
2474
  } else {
1974
2475
  result1 = null;
1975
- pos = pos3;
2476
+ pos = clone(pos3);
1976
2477
  }
1977
2478
  } else {
1978
2479
  result1 = null;
1979
- pos = pos3;
2480
+ pos = clone(pos3);
1980
2481
  }
1981
2482
  if (result1 !== null) {
1982
- result1 = (function(offset, param) {return param})(pos2, result1[3]);
2483
+ result1 = (function(offset, line, column, param) {return param})(pos2.offset, pos2.line, pos2.column, result1[3]);
1983
2484
  }
1984
2485
  if (result1 === null) {
1985
- pos = pos2;
2486
+ pos = clone(pos2);
1986
2487
  }
1987
2488
  if (result1 !== null) {
1988
2489
  result0 = [];
1989
2490
  while (result1 !== null) {
1990
2491
  result0.push(result1);
1991
- pos2 = pos;
1992
- pos3 = pos;
2492
+ pos2 = clone(pos);
2493
+ pos3 = clone(pos);
1993
2494
  result1 = parse_ws();
1994
2495
  if (result1 !== null) {
1995
- if (input.charCodeAt(pos) === 58) {
2496
+ if (input.charCodeAt(pos.offset) === 58) {
1996
2497
  result2 = ":";
1997
- pos++;
2498
+ advance(pos, 1);
1998
2499
  } else {
1999
2500
  result2 = null;
2000
2501
  if (reportFailures === 0) {
@@ -2009,25 +2510,25 @@ smalltalk.parser = (function(){
2009
2510
  result1 = [result1, result2, result3, result4];
2010
2511
  } else {
2011
2512
  result1 = null;
2012
- pos = pos3;
2513
+ pos = clone(pos3);
2013
2514
  }
2014
2515
  } else {
2015
2516
  result1 = null;
2016
- pos = pos3;
2517
+ pos = clone(pos3);
2017
2518
  }
2018
2519
  } else {
2019
2520
  result1 = null;
2020
- pos = pos3;
2521
+ pos = clone(pos3);
2021
2522
  }
2022
2523
  } else {
2023
2524
  result1 = null;
2024
- pos = pos3;
2525
+ pos = clone(pos3);
2025
2526
  }
2026
2527
  if (result1 !== null) {
2027
- result1 = (function(offset, param) {return param})(pos2, result1[3]);
2528
+ result1 = (function(offset, line, column, param) {return param})(pos2.offset, pos2.line, pos2.column, result1[3]);
2028
2529
  }
2029
2530
  if (result1 === null) {
2030
- pos = pos2;
2531
+ pos = clone(pos2);
2031
2532
  }
2032
2533
  }
2033
2534
  } else {
@@ -2036,9 +2537,9 @@ smalltalk.parser = (function(){
2036
2537
  if (result0 !== null) {
2037
2538
  result1 = parse_ws();
2038
2539
  if (result1 !== null) {
2039
- if (input.charCodeAt(pos) === 124) {
2540
+ if (input.charCodeAt(pos.offset) === 124) {
2040
2541
  result2 = "|";
2041
- pos++;
2542
+ advance(pos, 1);
2042
2543
  } else {
2043
2544
  result2 = null;
2044
2545
  if (reportFailures === 0) {
@@ -2049,34 +2550,46 @@ smalltalk.parser = (function(){
2049
2550
  result0 = [result0, result1, result2];
2050
2551
  } else {
2051
2552
  result0 = null;
2052
- pos = pos1;
2553
+ pos = clone(pos1);
2053
2554
  }
2054
2555
  } else {
2055
2556
  result0 = null;
2056
- pos = pos1;
2557
+ pos = clone(pos1);
2057
2558
  }
2058
2559
  } else {
2059
2560
  result0 = null;
2060
- pos = pos1;
2561
+ pos = clone(pos1);
2061
2562
  }
2062
2563
  if (result0 !== null) {
2063
- result0 = (function(offset, params) {return params})(pos0, result0[0]);
2564
+ result0 = (function(offset, line, column, params) {return params})(pos0.offset, pos0.line, pos0.column, result0[0]);
2064
2565
  }
2065
2566
  if (result0 === null) {
2066
- pos = pos0;
2567
+ pos = clone(pos0);
2067
2568
  }
2569
+
2570
+ cache[cacheKey] = {
2571
+ nextPos: clone(pos),
2572
+ result: result0
2573
+ };
2068
2574
  return result0;
2069
2575
  }
2070
2576
 
2071
2577
  function parse_subexpression() {
2578
+ var cacheKey = "subexpression@" + pos.offset;
2579
+ var cachedResult = cache[cacheKey];
2580
+ if (cachedResult) {
2581
+ pos = clone(cachedResult.nextPos);
2582
+ return cachedResult.result;
2583
+ }
2584
+
2072
2585
  var result0, result1, result2, result3, result4;
2073
2586
  var pos0, pos1;
2074
2587
 
2075
- pos0 = pos;
2076
- pos1 = pos;
2077
- if (input.charCodeAt(pos) === 40) {
2588
+ pos0 = clone(pos);
2589
+ pos1 = clone(pos);
2590
+ if (input.charCodeAt(pos.offset) === 40) {
2078
2591
  result0 = "(";
2079
- pos++;
2592
+ advance(pos, 1);
2080
2593
  } else {
2081
2594
  result0 = null;
2082
2595
  if (reportFailures === 0) {
@@ -2090,9 +2603,9 @@ smalltalk.parser = (function(){
2090
2603
  if (result2 !== null) {
2091
2604
  result3 = parse_ws();
2092
2605
  if (result3 !== null) {
2093
- if (input.charCodeAt(pos) === 41) {
2606
+ if (input.charCodeAt(pos.offset) === 41) {
2094
2607
  result4 = ")";
2095
- pos++;
2608
+ advance(pos, 1);
2096
2609
  } else {
2097
2610
  result4 = null;
2098
2611
  if (reportFailures === 0) {
@@ -2103,45 +2616,57 @@ smalltalk.parser = (function(){
2103
2616
  result0 = [result0, result1, result2, result3, result4];
2104
2617
  } else {
2105
2618
  result0 = null;
2106
- pos = pos1;
2619
+ pos = clone(pos1);
2107
2620
  }
2108
2621
  } else {
2109
2622
  result0 = null;
2110
- pos = pos1;
2623
+ pos = clone(pos1);
2111
2624
  }
2112
2625
  } else {
2113
2626
  result0 = null;
2114
- pos = pos1;
2627
+ pos = clone(pos1);
2115
2628
  }
2116
2629
  } else {
2117
2630
  result0 = null;
2118
- pos = pos1;
2631
+ pos = clone(pos1);
2119
2632
  }
2120
2633
  } else {
2121
2634
  result0 = null;
2122
- pos = pos1;
2635
+ pos = clone(pos1);
2123
2636
  }
2124
2637
  if (result0 !== null) {
2125
- result0 = (function(offset, expression) {return expression})(pos0, result0[2]);
2638
+ result0 = (function(offset, line, column, expression) {return expression})(pos0.offset, pos0.line, pos0.column, result0[2]);
2126
2639
  }
2127
2640
  if (result0 === null) {
2128
- pos = pos0;
2641
+ pos = clone(pos0);
2129
2642
  }
2643
+
2644
+ cache[cacheKey] = {
2645
+ nextPos: clone(pos),
2646
+ result: result0
2647
+ };
2130
2648
  return result0;
2131
2649
  }
2132
2650
 
2133
2651
  function parse_statements() {
2652
+ var cacheKey = "statements@" + pos.offset;
2653
+ var cachedResult = cache[cacheKey];
2654
+ if (cachedResult) {
2655
+ pos = clone(cachedResult.nextPos);
2656
+ return cachedResult.result;
2657
+ }
2658
+
2134
2659
  var result0, result1, result2, result3, result4, result5, result6;
2135
2660
  var pos0, pos1;
2136
2661
 
2137
- pos0 = pos;
2138
- pos1 = pos;
2662
+ pos0 = clone(pos);
2663
+ pos1 = clone(pos);
2139
2664
  result0 = parse_ret();
2140
2665
  if (result0 !== null) {
2141
2666
  result1 = [];
2142
- if (/^[.]/.test(input.charAt(pos))) {
2143
- result2 = input.charAt(pos);
2144
- pos++;
2667
+ if (/^[.]/.test(input.charAt(pos.offset))) {
2668
+ result2 = input.charAt(pos.offset);
2669
+ advance(pos, 1);
2145
2670
  } else {
2146
2671
  result2 = null;
2147
2672
  if (reportFailures === 0) {
@@ -2150,9 +2675,9 @@ smalltalk.parser = (function(){
2150
2675
  }
2151
2676
  while (result2 !== null) {
2152
2677
  result1.push(result2);
2153
- if (/^[.]/.test(input.charAt(pos))) {
2154
- result2 = input.charAt(pos);
2155
- pos++;
2678
+ if (/^[.]/.test(input.charAt(pos.offset))) {
2679
+ result2 = input.charAt(pos.offset);
2680
+ advance(pos, 1);
2156
2681
  } else {
2157
2682
  result2 = null;
2158
2683
  if (reportFailures === 0) {
@@ -2164,28 +2689,28 @@ smalltalk.parser = (function(){
2164
2689
  result0 = [result0, result1];
2165
2690
  } else {
2166
2691
  result0 = null;
2167
- pos = pos1;
2692
+ pos = clone(pos1);
2168
2693
  }
2169
2694
  } else {
2170
2695
  result0 = null;
2171
- pos = pos1;
2696
+ pos = clone(pos1);
2172
2697
  }
2173
2698
  if (result0 !== null) {
2174
- result0 = (function(offset, ret) {return [ret]})(pos0, result0[0]);
2699
+ result0 = (function(offset, line, column, ret) {return [ret]})(pos0.offset, pos0.line, pos0.column, result0[0]);
2175
2700
  }
2176
2701
  if (result0 === null) {
2177
- pos = pos0;
2702
+ pos = clone(pos0);
2178
2703
  }
2179
2704
  if (result0 === null) {
2180
- pos0 = pos;
2181
- pos1 = pos;
2705
+ pos0 = clone(pos);
2706
+ pos1 = clone(pos);
2182
2707
  result0 = parse_expressions();
2183
2708
  if (result0 !== null) {
2184
2709
  result1 = parse_ws();
2185
2710
  if (result1 !== null) {
2186
- if (/^[.]/.test(input.charAt(pos))) {
2187
- result3 = input.charAt(pos);
2188
- pos++;
2711
+ if (/^[.]/.test(input.charAt(pos.offset))) {
2712
+ result3 = input.charAt(pos.offset);
2713
+ advance(pos, 1);
2189
2714
  } else {
2190
2715
  result3 = null;
2191
2716
  if (reportFailures === 0) {
@@ -2196,9 +2721,9 @@ smalltalk.parser = (function(){
2196
2721
  result2 = [];
2197
2722
  while (result3 !== null) {
2198
2723
  result2.push(result3);
2199
- if (/^[.]/.test(input.charAt(pos))) {
2200
- result3 = input.charAt(pos);
2201
- pos++;
2724
+ if (/^[.]/.test(input.charAt(pos.offset))) {
2725
+ result3 = input.charAt(pos.offset);
2726
+ advance(pos, 1);
2202
2727
  } else {
2203
2728
  result3 = null;
2204
2729
  if (reportFailures === 0) {
@@ -2215,9 +2740,9 @@ smalltalk.parser = (function(){
2215
2740
  result4 = parse_ret();
2216
2741
  if (result4 !== null) {
2217
2742
  result5 = [];
2218
- if (/^[.]/.test(input.charAt(pos))) {
2219
- result6 = input.charAt(pos);
2220
- pos++;
2743
+ if (/^[.]/.test(input.charAt(pos.offset))) {
2744
+ result6 = input.charAt(pos.offset);
2745
+ advance(pos, 1);
2221
2746
  } else {
2222
2747
  result6 = null;
2223
2748
  if (reportFailures === 0) {
@@ -2226,9 +2751,9 @@ smalltalk.parser = (function(){
2226
2751
  }
2227
2752
  while (result6 !== null) {
2228
2753
  result5.push(result6);
2229
- if (/^[.]/.test(input.charAt(pos))) {
2230
- result6 = input.charAt(pos);
2231
- pos++;
2754
+ if (/^[.]/.test(input.charAt(pos.offset))) {
2755
+ result6 = input.charAt(pos.offset);
2756
+ advance(pos, 1);
2232
2757
  } else {
2233
2758
  result6 = null;
2234
2759
  if (reportFailures === 0) {
@@ -2240,48 +2765,48 @@ smalltalk.parser = (function(){
2240
2765
  result0 = [result0, result1, result2, result3, result4, result5];
2241
2766
  } else {
2242
2767
  result0 = null;
2243
- pos = pos1;
2768
+ pos = clone(pos1);
2244
2769
  }
2245
2770
  } else {
2246
2771
  result0 = null;
2247
- pos = pos1;
2772
+ pos = clone(pos1);
2248
2773
  }
2249
2774
  } else {
2250
2775
  result0 = null;
2251
- pos = pos1;
2776
+ pos = clone(pos1);
2252
2777
  }
2253
2778
  } else {
2254
2779
  result0 = null;
2255
- pos = pos1;
2780
+ pos = clone(pos1);
2256
2781
  }
2257
2782
  } else {
2258
2783
  result0 = null;
2259
- pos = pos1;
2784
+ pos = clone(pos1);
2260
2785
  }
2261
2786
  } else {
2262
2787
  result0 = null;
2263
- pos = pos1;
2788
+ pos = clone(pos1);
2264
2789
  }
2265
2790
  if (result0 !== null) {
2266
- result0 = (function(offset, exps, ret) {
2267
- var expressions = exps;
2268
- expressions.push(ret);
2269
- return expressions
2270
- })(pos0, result0[0], result0[4]);
2791
+ result0 = (function(offset, line, column, exps, ret) {
2792
+ var expressions = exps;
2793
+ expressions.push(ret);
2794
+ return expressions
2795
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[4]);
2271
2796
  }
2272
2797
  if (result0 === null) {
2273
- pos = pos0;
2798
+ pos = clone(pos0);
2274
2799
  }
2275
2800
  if (result0 === null) {
2276
- pos0 = pos;
2277
- pos1 = pos;
2801
+ pos0 = clone(pos);
2802
+ pos1 = clone(pos);
2278
2803
  result0 = parse_expressions();
2279
2804
  result0 = result0 !== null ? result0 : "";
2280
2805
  if (result0 !== null) {
2281
2806
  result1 = [];
2282
- if (/^[.]/.test(input.charAt(pos))) {
2283
- result2 = input.charAt(pos);
2284
- pos++;
2807
+ if (/^[.]/.test(input.charAt(pos.offset))) {
2808
+ result2 = input.charAt(pos.offset);
2809
+ advance(pos, 1);
2285
2810
  } else {
2286
2811
  result2 = null;
2287
2812
  if (reportFailures === 0) {
@@ -2290,9 +2815,9 @@ smalltalk.parser = (function(){
2290
2815
  }
2291
2816
  while (result2 !== null) {
2292
2817
  result1.push(result2);
2293
- if (/^[.]/.test(input.charAt(pos))) {
2294
- result2 = input.charAt(pos);
2295
- pos++;
2818
+ if (/^[.]/.test(input.charAt(pos.offset))) {
2819
+ result2 = input.charAt(pos.offset);
2820
+ advance(pos, 1);
2296
2821
  } else {
2297
2822
  result2 = null;
2298
2823
  if (reportFailures === 0) {
@@ -2304,31 +2829,65 @@ smalltalk.parser = (function(){
2304
2829
  result0 = [result0, result1];
2305
2830
  } else {
2306
2831
  result0 = null;
2307
- pos = pos1;
2832
+ pos = clone(pos1);
2308
2833
  }
2309
2834
  } else {
2310
2835
  result0 = null;
2311
- pos = pos1;
2836
+ pos = clone(pos1);
2312
2837
  }
2313
2838
  if (result0 !== null) {
2314
- result0 = (function(offset, expressions) {
2315
- return expressions || []
2316
- })(pos0, result0[0]);
2839
+ result0 = (function(offset, line, column, expressions) {
2840
+ return expressions || []
2841
+ })(pos0.offset, pos0.line, pos0.column, result0[0]);
2317
2842
  }
2318
2843
  if (result0 === null) {
2319
- pos = pos0;
2844
+ pos = clone(pos0);
2320
2845
  }
2321
2846
  }
2322
2847
  }
2848
+
2849
+ cache[cacheKey] = {
2850
+ nextPos: clone(pos),
2851
+ result: result0
2852
+ };
2323
2853
  return result0;
2324
2854
  }
2325
2855
 
2326
2856
  function parse_sequence() {
2857
+ var cacheKey = "sequence@" + pos.offset;
2858
+ var cachedResult = cache[cacheKey];
2859
+ if (cachedResult) {
2860
+ pos = clone(cachedResult.nextPos);
2861
+ return cachedResult.result;
2862
+ }
2863
+
2864
+ var result0;
2865
+
2866
+ result0 = parse_jsStatement();
2867
+ if (result0 === null) {
2868
+ result0 = parse_stSequence();
2869
+ }
2870
+
2871
+ cache[cacheKey] = {
2872
+ nextPos: clone(pos),
2873
+ result: result0
2874
+ };
2875
+ return result0;
2876
+ }
2877
+
2878
+ function parse_stSequence() {
2879
+ var cacheKey = "stSequence@" + pos.offset;
2880
+ var cachedResult = cache[cacheKey];
2881
+ if (cachedResult) {
2882
+ pos = clone(cachedResult.nextPos);
2883
+ return cachedResult.result;
2884
+ }
2885
+
2327
2886
  var result0, result1, result2, result3;
2328
2887
  var pos0, pos1;
2329
2888
 
2330
- pos0 = pos;
2331
- pos1 = pos;
2889
+ pos0 = clone(pos);
2890
+ pos1 = clone(pos);
2332
2891
  result0 = parse_temps();
2333
2892
  result0 = result0 !== null ? result0 : "";
2334
2893
  if (result0 !== null) {
@@ -2342,42 +2901,54 @@ smalltalk.parser = (function(){
2342
2901
  result0 = [result0, result1, result2, result3];
2343
2902
  } else {
2344
2903
  result0 = null;
2345
- pos = pos1;
2904
+ pos = clone(pos1);
2346
2905
  }
2347
2906
  } else {
2348
2907
  result0 = null;
2349
- pos = pos1;
2908
+ pos = clone(pos1);
2350
2909
  }
2351
2910
  } else {
2352
2911
  result0 = null;
2353
- pos = pos1;
2912
+ pos = clone(pos1);
2354
2913
  }
2355
2914
  } else {
2356
2915
  result0 = null;
2357
- pos = pos1;
2916
+ pos = clone(pos1);
2358
2917
  }
2359
2918
  if (result0 !== null) {
2360
- result0 = (function(offset, temps, statements) {
2361
- return smalltalk.SequenceNode._new()
2362
- ._temps_(temps || [])
2363
- ._nodes_(statements || [])
2364
- })(pos0, result0[0], result0[2]);
2919
+ result0 = (function(offset, line, column, temps, statements) {
2920
+ return smalltalk.SequenceNode._new()
2921
+ ._temps_(temps || [])
2922
+ ._nodes_(statements || [])
2923
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
2365
2924
  }
2366
2925
  if (result0 === null) {
2367
- pos = pos0;
2926
+ pos = clone(pos0);
2368
2927
  }
2928
+
2929
+ cache[cacheKey] = {
2930
+ nextPos: clone(pos),
2931
+ result: result0
2932
+ };
2369
2933
  return result0;
2370
2934
  }
2371
2935
 
2372
2936
  function parse_block() {
2937
+ var cacheKey = "block@" + pos.offset;
2938
+ var cachedResult = cache[cacheKey];
2939
+ if (cachedResult) {
2940
+ pos = clone(cachedResult.nextPos);
2941
+ return cachedResult.result;
2942
+ }
2943
+
2373
2944
  var result0, result1, result2, result3, result4, result5, result6;
2374
2945
  var pos0, pos1;
2375
2946
 
2376
- pos0 = pos;
2377
- pos1 = pos;
2378
- if (input.charCodeAt(pos) === 91) {
2947
+ pos0 = clone(pos);
2948
+ pos1 = clone(pos);
2949
+ if (input.charCodeAt(pos.offset) === 91) {
2379
2950
  result0 = "[";
2380
- pos++;
2951
+ advance(pos, 1);
2381
2952
  } else {
2382
2953
  result0 = null;
2383
2954
  if (reportFailures === 0) {
@@ -2397,9 +2968,9 @@ smalltalk.parser = (function(){
2397
2968
  if (result4 !== null) {
2398
2969
  result5 = parse_ws();
2399
2970
  if (result5 !== null) {
2400
- if (input.charCodeAt(pos) === 93) {
2971
+ if (input.charCodeAt(pos.offset) === 93) {
2401
2972
  result6 = "]";
2402
- pos++;
2973
+ advance(pos, 1);
2403
2974
  } else {
2404
2975
  result6 = null;
2405
2976
  if (reportFailures === 0) {
@@ -2410,46 +2981,58 @@ smalltalk.parser = (function(){
2410
2981
  result0 = [result0, result1, result2, result3, result4, result5, result6];
2411
2982
  } else {
2412
2983
  result0 = null;
2413
- pos = pos1;
2984
+ pos = clone(pos1);
2414
2985
  }
2415
2986
  } else {
2416
2987
  result0 = null;
2417
- pos = pos1;
2988
+ pos = clone(pos1);
2418
2989
  }
2419
2990
  } else {
2420
2991
  result0 = null;
2421
- pos = pos1;
2992
+ pos = clone(pos1);
2422
2993
  }
2423
2994
  } else {
2424
2995
  result0 = null;
2425
- pos = pos1;
2996
+ pos = clone(pos1);
2426
2997
  }
2427
2998
  } else {
2428
2999
  result0 = null;
2429
- pos = pos1;
3000
+ pos = clone(pos1);
2430
3001
  }
2431
3002
  } else {
2432
3003
  result0 = null;
2433
- pos = pos1;
3004
+ pos = clone(pos1);
2434
3005
  }
2435
3006
  } else {
2436
3007
  result0 = null;
2437
- pos = pos1;
3008
+ pos = clone(pos1);
2438
3009
  }
2439
3010
  if (result0 !== null) {
2440
- result0 = (function(offset, params, sequence) {
2441
- return smalltalk.BlockNode._new()
2442
- ._parameters_(params || [])
2443
- ._nodes_([sequence._asBlockSequenceNode()])
2444
- })(pos0, result0[2], result0[4]);
3011
+ result0 = (function(offset, line, column, params, sequence) {
3012
+ return smalltalk.BlockNode._new()
3013
+ ._parameters_(params || [])
3014
+ ._nodes_([sequence._asBlockSequenceNode()])
3015
+ })(pos0.offset, pos0.line, pos0.column, result0[2], result0[4]);
2445
3016
  }
2446
3017
  if (result0 === null) {
2447
- pos = pos0;
3018
+ pos = clone(pos0);
2448
3019
  }
3020
+
3021
+ cache[cacheKey] = {
3022
+ nextPos: clone(pos),
3023
+ result: result0
3024
+ };
2449
3025
  return result0;
2450
3026
  }
2451
3027
 
2452
3028
  function parse_operand() {
3029
+ var cacheKey = "operand@" + pos.offset;
3030
+ var cachedResult = cache[cacheKey];
3031
+ if (cachedResult) {
3032
+ pos = clone(cachedResult.nextPos);
3033
+ return cachedResult.result;
3034
+ }
3035
+
2453
3036
  var result0;
2454
3037
 
2455
3038
  result0 = parse_literal();
@@ -2459,24 +3042,36 @@ smalltalk.parser = (function(){
2459
3042
  result0 = parse_subexpression();
2460
3043
  }
2461
3044
  }
3045
+
3046
+ cache[cacheKey] = {
3047
+ nextPos: clone(pos),
3048
+ result: result0
3049
+ };
2462
3050
  return result0;
2463
3051
  }
2464
3052
 
2465
3053
  function parse_unaryMessage() {
3054
+ var cacheKey = "unaryMessage@" + pos.offset;
3055
+ var cachedResult = cache[cacheKey];
3056
+ if (cachedResult) {
3057
+ pos = clone(cachedResult.nextPos);
3058
+ return cachedResult.result;
3059
+ }
3060
+
2466
3061
  var result0, result1, result2;
2467
3062
  var pos0, pos1, pos2;
2468
3063
 
2469
- pos0 = pos;
2470
- pos1 = pos;
3064
+ pos0 = clone(pos);
3065
+ pos1 = clone(pos);
2471
3066
  result0 = parse_ws();
2472
3067
  if (result0 !== null) {
2473
3068
  result1 = parse_identifier();
2474
3069
  if (result1 !== null) {
2475
- pos2 = pos;
3070
+ pos2 = clone(pos);
2476
3071
  reportFailures++;
2477
- if (/^[:]/.test(input.charAt(pos))) {
2478
- result2 = input.charAt(pos);
2479
- pos++;
3072
+ if (/^[:]/.test(input.charAt(pos.offset))) {
3073
+ result2 = input.charAt(pos.offset);
3074
+ advance(pos, 1);
2480
3075
  } else {
2481
3076
  result2 = null;
2482
3077
  if (reportFailures === 0) {
@@ -2488,40 +3083,52 @@ smalltalk.parser = (function(){
2488
3083
  result2 = "";
2489
3084
  } else {
2490
3085
  result2 = null;
2491
- pos = pos2;
3086
+ pos = clone(pos2);
2492
3087
  }
2493
3088
  if (result2 !== null) {
2494
3089
  result0 = [result0, result1, result2];
2495
3090
  } else {
2496
3091
  result0 = null;
2497
- pos = pos1;
3092
+ pos = clone(pos1);
2498
3093
  }
2499
3094
  } else {
2500
3095
  result0 = null;
2501
- pos = pos1;
3096
+ pos = clone(pos1);
2502
3097
  }
2503
3098
  } else {
2504
3099
  result0 = null;
2505
- pos = pos1;
3100
+ pos = clone(pos1);
2506
3101
  }
2507
3102
  if (result0 !== null) {
2508
- result0 = (function(offset, selector) {
2509
- return smalltalk.SendNode._new()
2510
- ._selector_(selector)
2511
- })(pos0, result0[1]);
3103
+ result0 = (function(offset, line, column, selector) {
3104
+ return smalltalk.SendNode._new()
3105
+ ._selector_(selector)
3106
+ })(pos0.offset, pos0.line, pos0.column, result0[1]);
2512
3107
  }
2513
3108
  if (result0 === null) {
2514
- pos = pos0;
3109
+ pos = clone(pos0);
2515
3110
  }
3111
+
3112
+ cache[cacheKey] = {
3113
+ nextPos: clone(pos),
3114
+ result: result0
3115
+ };
2516
3116
  return result0;
2517
3117
  }
2518
3118
 
2519
3119
  function parse_unaryTail() {
3120
+ var cacheKey = "unaryTail@" + pos.offset;
3121
+ var cachedResult = cache[cacheKey];
3122
+ if (cachedResult) {
3123
+ pos = clone(cachedResult.nextPos);
3124
+ return cachedResult.result;
3125
+ }
3126
+
2520
3127
  var result0, result1, result2, result3;
2521
3128
  var pos0, pos1;
2522
3129
 
2523
- pos0 = pos;
2524
- pos1 = pos;
3130
+ pos0 = clone(pos);
3131
+ pos1 = clone(pos);
2525
3132
  result0 = parse_unaryMessage();
2526
3133
  if (result0 !== null) {
2527
3134
  result1 = parse_ws();
@@ -2534,42 +3141,54 @@ smalltalk.parser = (function(){
2534
3141
  result0 = [result0, result1, result2, result3];
2535
3142
  } else {
2536
3143
  result0 = null;
2537
- pos = pos1;
3144
+ pos = clone(pos1);
2538
3145
  }
2539
3146
  } else {
2540
3147
  result0 = null;
2541
- pos = pos1;
3148
+ pos = clone(pos1);
2542
3149
  }
2543
3150
  } else {
2544
3151
  result0 = null;
2545
- pos = pos1;
3152
+ pos = clone(pos1);
2546
3153
  }
2547
3154
  } else {
2548
3155
  result0 = null;
2549
- pos = pos1;
3156
+ pos = clone(pos1);
2550
3157
  }
2551
3158
  if (result0 !== null) {
2552
- result0 = (function(offset, message, tail) {
2553
- if(tail) {
2554
- return tail._valueForReceiver_(message);
2555
- }
2556
- else {
2557
- return message;
2558
- }
2559
- })(pos0, result0[0], result0[2]);
3159
+ result0 = (function(offset, line, column, message, tail) {
3160
+ if(tail) {
3161
+ return tail._valueForReceiver_(message);
3162
+ }
3163
+ else {
3164
+ return message;
3165
+ }
3166
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
2560
3167
  }
2561
3168
  if (result0 === null) {
2562
- pos = pos0;
3169
+ pos = clone(pos0);
2563
3170
  }
3171
+
3172
+ cache[cacheKey] = {
3173
+ nextPos: clone(pos),
3174
+ result: result0
3175
+ };
2564
3176
  return result0;
2565
3177
  }
2566
3178
 
2567
3179
  function parse_unarySend() {
3180
+ var cacheKey = "unarySend@" + pos.offset;
3181
+ var cachedResult = cache[cacheKey];
3182
+ if (cachedResult) {
3183
+ pos = clone(cachedResult.nextPos);
3184
+ return cachedResult.result;
3185
+ }
3186
+
2568
3187
  var result0, result1, result2;
2569
3188
  var pos0, pos1;
2570
3189
 
2571
- pos0 = pos;
2572
- pos1 = pos;
3190
+ pos0 = clone(pos);
3191
+ pos1 = clone(pos);
2573
3192
  result0 = parse_operand();
2574
3193
  if (result0 !== null) {
2575
3194
  result1 = parse_ws();
@@ -2580,38 +3199,50 @@ smalltalk.parser = (function(){
2580
3199
  result0 = [result0, result1, result2];
2581
3200
  } else {
2582
3201
  result0 = null;
2583
- pos = pos1;
3202
+ pos = clone(pos1);
2584
3203
  }
2585
3204
  } else {
2586
3205
  result0 = null;
2587
- pos = pos1;
3206
+ pos = clone(pos1);
2588
3207
  }
2589
3208
  } else {
2590
3209
  result0 = null;
2591
- pos = pos1;
3210
+ pos = clone(pos1);
2592
3211
  }
2593
3212
  if (result0 !== null) {
2594
- result0 = (function(offset, receiver, tail) {
2595
- if(tail) {
2596
- return tail._valueForReceiver_(receiver);
2597
- }
2598
- else {
2599
- return receiver;
2600
- }
2601
- })(pos0, result0[0], result0[2]);
3213
+ result0 = (function(offset, line, column, receiver, tail) {
3214
+ if(tail) {
3215
+ return tail._valueForReceiver_(receiver);
3216
+ }
3217
+ else {
3218
+ return receiver;
3219
+ }
3220
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
2602
3221
  }
2603
3222
  if (result0 === null) {
2604
- pos = pos0;
3223
+ pos = clone(pos0);
2605
3224
  }
3225
+
3226
+ cache[cacheKey] = {
3227
+ nextPos: clone(pos),
3228
+ result: result0
3229
+ };
2606
3230
  return result0;
2607
3231
  }
2608
3232
 
2609
3233
  function parse_binaryMessage() {
3234
+ var cacheKey = "binaryMessage@" + pos.offset;
3235
+ var cachedResult = cache[cacheKey];
3236
+ if (cachedResult) {
3237
+ pos = clone(cachedResult.nextPos);
3238
+ return cachedResult.result;
3239
+ }
3240
+
2610
3241
  var result0, result1, result2, result3;
2611
3242
  var pos0, pos1;
2612
3243
 
2613
- pos0 = pos;
2614
- pos1 = pos;
3244
+ pos0 = clone(pos);
3245
+ pos1 = clone(pos);
2615
3246
  result0 = parse_ws();
2616
3247
  if (result0 !== null) {
2617
3248
  result1 = parse_binarySelector();
@@ -2626,39 +3257,51 @@ smalltalk.parser = (function(){
2626
3257
  result0 = [result0, result1, result2, result3];
2627
3258
  } else {
2628
3259
  result0 = null;
2629
- pos = pos1;
3260
+ pos = clone(pos1);
2630
3261
  }
2631
3262
  } else {
2632
3263
  result0 = null;
2633
- pos = pos1;
3264
+ pos = clone(pos1);
2634
3265
  }
2635
3266
  } else {
2636
3267
  result0 = null;
2637
- pos = pos1;
3268
+ pos = clone(pos1);
2638
3269
  }
2639
3270
  } else {
2640
3271
  result0 = null;
2641
- pos = pos1;
3272
+ pos = clone(pos1);
2642
3273
  }
2643
3274
  if (result0 !== null) {
2644
- result0 = (function(offset, selector, arg) {
2645
- return smalltalk.SendNode._new()
2646
- ._selector_(selector)
2647
- ._arguments_([arg])
2648
- })(pos0, result0[1], result0[3]);
3275
+ result0 = (function(offset, line, column, selector, arg) {
3276
+ return smalltalk.SendNode._new()
3277
+ ._selector_(selector)
3278
+ ._arguments_([arg])
3279
+ })(pos0.offset, pos0.line, pos0.column, result0[1], result0[3]);
2649
3280
  }
2650
3281
  if (result0 === null) {
2651
- pos = pos0;
3282
+ pos = clone(pos0);
2652
3283
  }
3284
+
3285
+ cache[cacheKey] = {
3286
+ nextPos: clone(pos),
3287
+ result: result0
3288
+ };
2653
3289
  return result0;
2654
3290
  }
2655
3291
 
2656
3292
  function parse_binaryTail() {
3293
+ var cacheKey = "binaryTail@" + pos.offset;
3294
+ var cachedResult = cache[cacheKey];
3295
+ if (cachedResult) {
3296
+ pos = clone(cachedResult.nextPos);
3297
+ return cachedResult.result;
3298
+ }
3299
+
2657
3300
  var result0, result1;
2658
3301
  var pos0, pos1;
2659
3302
 
2660
- pos0 = pos;
2661
- pos1 = pos;
3303
+ pos0 = clone(pos);
3304
+ pos1 = clone(pos);
2662
3305
  result0 = parse_binaryMessage();
2663
3306
  if (result0 !== null) {
2664
3307
  result1 = parse_binaryTail();
@@ -2667,34 +3310,46 @@ smalltalk.parser = (function(){
2667
3310
  result0 = [result0, result1];
2668
3311
  } else {
2669
3312
  result0 = null;
2670
- pos = pos1;
3313
+ pos = clone(pos1);
2671
3314
  }
2672
3315
  } else {
2673
3316
  result0 = null;
2674
- pos = pos1;
3317
+ pos = clone(pos1);
2675
3318
  }
2676
3319
  if (result0 !== null) {
2677
- result0 = (function(offset, message, tail) {
2678
- if(tail) {
2679
- return tail._valueForReceiver_(message);
2680
- }
2681
- else {
2682
- return message;
2683
- }
2684
- })(pos0, result0[0], result0[1]);
3320
+ result0 = (function(offset, line, column, message, tail) {
3321
+ if(tail) {
3322
+ return tail._valueForReceiver_(message);
3323
+ }
3324
+ else {
3325
+ return message;
3326
+ }
3327
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
2685
3328
  }
2686
3329
  if (result0 === null) {
2687
- pos = pos0;
3330
+ pos = clone(pos0);
2688
3331
  }
3332
+
3333
+ cache[cacheKey] = {
3334
+ nextPos: clone(pos),
3335
+ result: result0
3336
+ };
2689
3337
  return result0;
2690
3338
  }
2691
3339
 
2692
3340
  function parse_binarySend() {
3341
+ var cacheKey = "binarySend@" + pos.offset;
3342
+ var cachedResult = cache[cacheKey];
3343
+ if (cachedResult) {
3344
+ pos = clone(cachedResult.nextPos);
3345
+ return cachedResult.result;
3346
+ }
3347
+
2693
3348
  var result0, result1;
2694
3349
  var pos0, pos1;
2695
3350
 
2696
- pos0 = pos;
2697
- pos1 = pos;
3351
+ pos0 = clone(pos);
3352
+ pos1 = clone(pos);
2698
3353
  result0 = parse_unarySend();
2699
3354
  if (result0 !== null) {
2700
3355
  result1 = parse_binaryTail();
@@ -2703,38 +3358,50 @@ smalltalk.parser = (function(){
2703
3358
  result0 = [result0, result1];
2704
3359
  } else {
2705
3360
  result0 = null;
2706
- pos = pos1;
3361
+ pos = clone(pos1);
2707
3362
  }
2708
3363
  } else {
2709
3364
  result0 = null;
2710
- pos = pos1;
3365
+ pos = clone(pos1);
2711
3366
  }
2712
3367
  if (result0 !== null) {
2713
- result0 = (function(offset, receiver, tail) {
2714
- if(tail) {
2715
- return tail._valueForReceiver_(receiver);
2716
- }
2717
- else {
2718
- return receiver;
2719
- }
2720
- })(pos0, result0[0], result0[1]);
3368
+ result0 = (function(offset, line, column, receiver, tail) {
3369
+ if(tail) {
3370
+ return tail._valueForReceiver_(receiver);
3371
+ }
3372
+ else {
3373
+ return receiver;
3374
+ }
3375
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
2721
3376
  }
2722
3377
  if (result0 === null) {
2723
- pos = pos0;
3378
+ pos = clone(pos0);
2724
3379
  }
3380
+
3381
+ cache[cacheKey] = {
3382
+ nextPos: clone(pos),
3383
+ result: result0
3384
+ };
2725
3385
  return result0;
2726
3386
  }
2727
3387
 
2728
3388
  function parse_keywordMessage() {
3389
+ var cacheKey = "keywordMessage@" + pos.offset;
3390
+ var cachedResult = cache[cacheKey];
3391
+ if (cachedResult) {
3392
+ pos = clone(cachedResult.nextPos);
3393
+ return cachedResult.result;
3394
+ }
3395
+
2729
3396
  var result0, result1, result2, result3;
2730
3397
  var pos0, pos1, pos2, pos3;
2731
3398
 
2732
- pos0 = pos;
2733
- pos1 = pos;
3399
+ pos0 = clone(pos);
3400
+ pos1 = clone(pos);
2734
3401
  result0 = parse_ws();
2735
3402
  if (result0 !== null) {
2736
- pos2 = pos;
2737
- pos3 = pos;
3403
+ pos2 = clone(pos);
3404
+ pos3 = clone(pos);
2738
3405
  result2 = parse_keywordPair();
2739
3406
  if (result2 !== null) {
2740
3407
  result3 = parse_ws();
@@ -2742,24 +3409,24 @@ smalltalk.parser = (function(){
2742
3409
  result2 = [result2, result3];
2743
3410
  } else {
2744
3411
  result2 = null;
2745
- pos = pos3;
3412
+ pos = clone(pos3);
2746
3413
  }
2747
3414
  } else {
2748
3415
  result2 = null;
2749
- pos = pos3;
3416
+ pos = clone(pos3);
2750
3417
  }
2751
3418
  if (result2 !== null) {
2752
- result2 = (function(offset, pair) {return pair})(pos2, result2[0]);
3419
+ result2 = (function(offset, line, column, pair) {return pair})(pos2.offset, pos2.line, pos2.column, result2[0]);
2753
3420
  }
2754
3421
  if (result2 === null) {
2755
- pos = pos2;
3422
+ pos = clone(pos2);
2756
3423
  }
2757
3424
  if (result2 !== null) {
2758
3425
  result1 = [];
2759
3426
  while (result2 !== null) {
2760
3427
  result1.push(result2);
2761
- pos2 = pos;
2762
- pos3 = pos;
3428
+ pos2 = clone(pos);
3429
+ pos3 = clone(pos);
2763
3430
  result2 = parse_keywordPair();
2764
3431
  if (result2 !== null) {
2765
3432
  result3 = parse_ws();
@@ -2767,17 +3434,17 @@ smalltalk.parser = (function(){
2767
3434
  result2 = [result2, result3];
2768
3435
  } else {
2769
3436
  result2 = null;
2770
- pos = pos3;
3437
+ pos = clone(pos3);
2771
3438
  }
2772
3439
  } else {
2773
3440
  result2 = null;
2774
- pos = pos3;
3441
+ pos = clone(pos3);
2775
3442
  }
2776
3443
  if (result2 !== null) {
2777
- result2 = (function(offset, pair) {return pair})(pos2, result2[0]);
3444
+ result2 = (function(offset, line, column, pair) {return pair})(pos2.offset, pos2.line, pos2.column, result2[0]);
2778
3445
  }
2779
3446
  if (result2 === null) {
2780
- pos = pos2;
3447
+ pos = clone(pos2);
2781
3448
  }
2782
3449
  }
2783
3450
  } else {
@@ -2787,37 +3454,49 @@ smalltalk.parser = (function(){
2787
3454
  result0 = [result0, result1];
2788
3455
  } else {
2789
3456
  result0 = null;
2790
- pos = pos1;
3457
+ pos = clone(pos1);
2791
3458
  }
2792
3459
  } else {
2793
3460
  result0 = null;
2794
- pos = pos1;
3461
+ pos = clone(pos1);
2795
3462
  }
2796
3463
  if (result0 !== null) {
2797
- result0 = (function(offset, pairs) {
2798
- var selector = [];
2799
- var args = [];
2800
- for(var i=0;i<pairs.length;i++) {
2801
- selector.push(pairs[i].key);
2802
- args.push(pairs[i].arg);
2803
- }
2804
- return smalltalk.SendNode._new()
2805
- ._selector_(selector.join(""))
2806
- ._arguments_(args)
2807
- })(pos0, result0[1]);
3464
+ result0 = (function(offset, line, column, pairs) {
3465
+ var selector = [];
3466
+ var args = [];
3467
+ for(var i=0;i<pairs.length;i++) {
3468
+ selector.push(pairs[i].key);
3469
+ args.push(pairs[i].arg);
3470
+ }
3471
+ return smalltalk.SendNode._new()
3472
+ ._selector_(selector.join(""))
3473
+ ._arguments_(args)
3474
+ })(pos0.offset, pos0.line, pos0.column, result0[1]);
2808
3475
  }
2809
3476
  if (result0 === null) {
2810
- pos = pos0;
3477
+ pos = clone(pos0);
2811
3478
  }
3479
+
3480
+ cache[cacheKey] = {
3481
+ nextPos: clone(pos),
3482
+ result: result0
3483
+ };
2812
3484
  return result0;
2813
3485
  }
2814
3486
 
2815
3487
  function parse_keywordSend() {
3488
+ var cacheKey = "keywordSend@" + pos.offset;
3489
+ var cachedResult = cache[cacheKey];
3490
+ if (cachedResult) {
3491
+ pos = clone(cachedResult.nextPos);
3492
+ return cachedResult.result;
3493
+ }
3494
+
2816
3495
  var result0, result1;
2817
3496
  var pos0, pos1;
2818
3497
 
2819
- pos0 = pos;
2820
- pos1 = pos;
3498
+ pos0 = clone(pos);
3499
+ pos1 = clone(pos);
2821
3500
  result0 = parse_binarySend();
2822
3501
  if (result0 !== null) {
2823
3502
  result1 = parse_keywordMessage();
@@ -2825,24 +3504,36 @@ smalltalk.parser = (function(){
2825
3504
  result0 = [result0, result1];
2826
3505
  } else {
2827
3506
  result0 = null;
2828
- pos = pos1;
3507
+ pos = clone(pos1);
2829
3508
  }
2830
3509
  } else {
2831
3510
  result0 = null;
2832
- pos = pos1;
3511
+ pos = clone(pos1);
2833
3512
  }
2834
3513
  if (result0 !== null) {
2835
- result0 = (function(offset, receiver, tail) {
2836
- return tail._valueForReceiver_(receiver);
2837
- })(pos0, result0[0], result0[1]);
3514
+ result0 = (function(offset, line, column, receiver, tail) {
3515
+ return tail._valueForReceiver_(receiver);
3516
+ })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
2838
3517
  }
2839
3518
  if (result0 === null) {
2840
- pos = pos0;
3519
+ pos = clone(pos0);
2841
3520
  }
3521
+
3522
+ cache[cacheKey] = {
3523
+ nextPos: clone(pos),
3524
+ result: result0
3525
+ };
2842
3526
  return result0;
2843
3527
  }
2844
3528
 
2845
3529
  function parse_message() {
3530
+ var cacheKey = "message@" + pos.offset;
3531
+ var cachedResult = cache[cacheKey];
3532
+ if (cachedResult) {
3533
+ pos = clone(cachedResult.nextPos);
3534
+ return cachedResult.result;
3535
+ }
3536
+
2846
3537
  var result0;
2847
3538
 
2848
3539
  result0 = parse_binaryMessage();
@@ -2852,15 +3543,27 @@ smalltalk.parser = (function(){
2852
3543
  result0 = parse_keywordMessage();
2853
3544
  }
2854
3545
  }
3546
+
3547
+ cache[cacheKey] = {
3548
+ nextPos: clone(pos),
3549
+ result: result0
3550
+ };
2855
3551
  return result0;
2856
3552
  }
2857
3553
 
2858
3554
  function parse_cascade() {
3555
+ var cacheKey = "cascade@" + pos.offset;
3556
+ var cachedResult = cache[cacheKey];
3557
+ if (cachedResult) {
3558
+ pos = clone(cachedResult.nextPos);
3559
+ return cachedResult.result;
3560
+ }
3561
+
2859
3562
  var result0, result1, result2, result3, result4, result5, result6, result7;
2860
3563
  var pos0, pos1, pos2, pos3;
2861
3564
 
2862
- pos0 = pos;
2863
- pos1 = pos;
3565
+ pos0 = clone(pos);
3566
+ pos1 = clone(pos);
2864
3567
  result0 = parse_ws();
2865
3568
  if (result0 !== null) {
2866
3569
  result1 = parse_keywordSend();
@@ -2868,13 +3571,13 @@ smalltalk.parser = (function(){
2868
3571
  result1 = parse_binarySend();
2869
3572
  }
2870
3573
  if (result1 !== null) {
2871
- pos2 = pos;
2872
- pos3 = pos;
3574
+ pos2 = clone(pos);
3575
+ pos3 = clone(pos);
2873
3576
  result3 = parse_ws();
2874
3577
  if (result3 !== null) {
2875
- if (input.charCodeAt(pos) === 59) {
3578
+ if (input.charCodeAt(pos.offset) === 59) {
2876
3579
  result4 = ";";
2877
- pos++;
3580
+ advance(pos, 1);
2878
3581
  } else {
2879
3582
  result4 = null;
2880
3583
  if (reportFailures === 0) {
@@ -2891,41 +3594,41 @@ smalltalk.parser = (function(){
2891
3594
  result3 = [result3, result4, result5, result6, result7];
2892
3595
  } else {
2893
3596
  result3 = null;
2894
- pos = pos3;
3597
+ pos = clone(pos3);
2895
3598
  }
2896
3599
  } else {
2897
3600
  result3 = null;
2898
- pos = pos3;
3601
+ pos = clone(pos3);
2899
3602
  }
2900
3603
  } else {
2901
3604
  result3 = null;
2902
- pos = pos3;
3605
+ pos = clone(pos3);
2903
3606
  }
2904
3607
  } else {
2905
3608
  result3 = null;
2906
- pos = pos3;
3609
+ pos = clone(pos3);
2907
3610
  }
2908
3611
  } else {
2909
3612
  result3 = null;
2910
- pos = pos3;
3613
+ pos = clone(pos3);
2911
3614
  }
2912
3615
  if (result3 !== null) {
2913
- result3 = (function(offset, mess) {return mess})(pos2, result3[3]);
3616
+ result3 = (function(offset, line, column, mess) {return mess})(pos2.offset, pos2.line, pos2.column, result3[3]);
2914
3617
  }
2915
3618
  if (result3 === null) {
2916
- pos = pos2;
3619
+ pos = clone(pos2);
2917
3620
  }
2918
3621
  if (result3 !== null) {
2919
3622
  result2 = [];
2920
3623
  while (result3 !== null) {
2921
3624
  result2.push(result3);
2922
- pos2 = pos;
2923
- pos3 = pos;
3625
+ pos2 = clone(pos);
3626
+ pos3 = clone(pos);
2924
3627
  result3 = parse_ws();
2925
3628
  if (result3 !== null) {
2926
- if (input.charCodeAt(pos) === 59) {
3629
+ if (input.charCodeAt(pos.offset) === 59) {
2927
3630
  result4 = ";";
2928
- pos++;
3631
+ advance(pos, 1);
2929
3632
  } else {
2930
3633
  result4 = null;
2931
3634
  if (reportFailures === 0) {
@@ -2942,29 +3645,29 @@ smalltalk.parser = (function(){
2942
3645
  result3 = [result3, result4, result5, result6, result7];
2943
3646
  } else {
2944
3647
  result3 = null;
2945
- pos = pos3;
3648
+ pos = clone(pos3);
2946
3649
  }
2947
3650
  } else {
2948
3651
  result3 = null;
2949
- pos = pos3;
3652
+ pos = clone(pos3);
2950
3653
  }
2951
3654
  } else {
2952
3655
  result3 = null;
2953
- pos = pos3;
3656
+ pos = clone(pos3);
2954
3657
  }
2955
3658
  } else {
2956
3659
  result3 = null;
2957
- pos = pos3;
3660
+ pos = clone(pos3);
2958
3661
  }
2959
3662
  } else {
2960
3663
  result3 = null;
2961
- pos = pos3;
3664
+ pos = clone(pos3);
2962
3665
  }
2963
3666
  if (result3 !== null) {
2964
- result3 = (function(offset, mess) {return mess})(pos2, result3[3]);
3667
+ result3 = (function(offset, line, column, mess) {return mess})(pos2.offset, pos2.line, pos2.column, result3[3]);
2965
3668
  }
2966
3669
  if (result3 === null) {
2967
- pos = pos2;
3670
+ pos = clone(pos2);
2968
3671
  }
2969
3672
  }
2970
3673
  } else {
@@ -2974,43 +3677,55 @@ smalltalk.parser = (function(){
2974
3677
  result0 = [result0, result1, result2];
2975
3678
  } else {
2976
3679
  result0 = null;
2977
- pos = pos1;
3680
+ pos = clone(pos1);
2978
3681
  }
2979
3682
  } else {
2980
3683
  result0 = null;
2981
- pos = pos1;
3684
+ pos = clone(pos1);
2982
3685
  }
2983
3686
  } else {
2984
3687
  result0 = null;
2985
- pos = pos1;
3688
+ pos = clone(pos1);
2986
3689
  }
2987
3690
  if (result0 !== null) {
2988
- result0 = (function(offset, send, messages) {
2989
- var cascade = [];
2990
- cascade.push(send);
2991
- for(var i=0;i<messages.length;i++) {
2992
- cascade.push(messages[i]);
2993
- }
2994
- return smalltalk.CascadeNode._new()
2995
- ._receiver_(send._receiver())
2996
- ._nodes_(cascade)
2997
- })(pos0, result0[1], result0[2]);
3691
+ result0 = (function(offset, line, column, send, messages) {
3692
+ var cascade = [];
3693
+ cascade.push(send);
3694
+ for(var i=0;i<messages.length;i++) {
3695
+ cascade.push(messages[i]);
3696
+ }
3697
+ return smalltalk.CascadeNode._new()
3698
+ ._receiver_(send._receiver())
3699
+ ._nodes_(cascade)
3700
+ })(pos0.offset, pos0.line, pos0.column, result0[1], result0[2]);
2998
3701
  }
2999
3702
  if (result0 === null) {
3000
- pos = pos0;
3703
+ pos = clone(pos0);
3001
3704
  }
3705
+
3706
+ cache[cacheKey] = {
3707
+ nextPos: clone(pos),
3708
+ result: result0
3709
+ };
3002
3710
  return result0;
3003
3711
  }
3004
3712
 
3005
3713
  function parse_jsStatement() {
3714
+ var cacheKey = "jsStatement@" + pos.offset;
3715
+ var cachedResult = cache[cacheKey];
3716
+ if (cachedResult) {
3717
+ pos = clone(cachedResult.nextPos);
3718
+ return cachedResult.result;
3719
+ }
3720
+
3006
3721
  var result0, result1, result2;
3007
3722
  var pos0, pos1, pos2;
3008
3723
 
3009
- pos0 = pos;
3010
- pos1 = pos;
3011
- if (input.charCodeAt(pos) === 60) {
3724
+ pos0 = clone(pos);
3725
+ pos1 = clone(pos);
3726
+ if (input.charCodeAt(pos.offset) === 60) {
3012
3727
  result0 = "<";
3013
- pos++;
3728
+ advance(pos, 1);
3014
3729
  } else {
3015
3730
  result0 = null;
3016
3731
  if (reportFailures === 0) {
@@ -3019,10 +3734,10 @@ smalltalk.parser = (function(){
3019
3734
  }
3020
3735
  if (result0 !== null) {
3021
3736
  result1 = [];
3022
- pos2 = pos;
3023
- if (input.substr(pos, 2) === ">>") {
3737
+ pos2 = clone(pos);
3738
+ if (input.substr(pos.offset, 2) === ">>") {
3024
3739
  result2 = ">>";
3025
- pos += 2;
3740
+ advance(pos, 2);
3026
3741
  } else {
3027
3742
  result2 = null;
3028
3743
  if (reportFailures === 0) {
@@ -3030,15 +3745,15 @@ smalltalk.parser = (function(){
3030
3745
  }
3031
3746
  }
3032
3747
  if (result2 !== null) {
3033
- result2 = (function(offset) {return ">"})(pos2);
3748
+ result2 = (function(offset, line, column) {return ">"})(pos2.offset, pos2.line, pos2.column);
3034
3749
  }
3035
3750
  if (result2 === null) {
3036
- pos = pos2;
3751
+ pos = clone(pos2);
3037
3752
  }
3038
3753
  if (result2 === null) {
3039
- if (/^[^>]/.test(input.charAt(pos))) {
3040
- result2 = input.charAt(pos);
3041
- pos++;
3754
+ if (/^[^>]/.test(input.charAt(pos.offset))) {
3755
+ result2 = input.charAt(pos.offset);
3756
+ advance(pos, 1);
3042
3757
  } else {
3043
3758
  result2 = null;
3044
3759
  if (reportFailures === 0) {
@@ -3048,10 +3763,10 @@ smalltalk.parser = (function(){
3048
3763
  }
3049
3764
  while (result2 !== null) {
3050
3765
  result1.push(result2);
3051
- pos2 = pos;
3052
- if (input.substr(pos, 2) === ">>") {
3766
+ pos2 = clone(pos);
3767
+ if (input.substr(pos.offset, 2) === ">>") {
3053
3768
  result2 = ">>";
3054
- pos += 2;
3769
+ advance(pos, 2);
3055
3770
  } else {
3056
3771
  result2 = null;
3057
3772
  if (reportFailures === 0) {
@@ -3059,15 +3774,15 @@ smalltalk.parser = (function(){
3059
3774
  }
3060
3775
  }
3061
3776
  if (result2 !== null) {
3062
- result2 = (function(offset) {return ">"})(pos2);
3777
+ result2 = (function(offset, line, column) {return ">"})(pos2.offset, pos2.line, pos2.column);
3063
3778
  }
3064
3779
  if (result2 === null) {
3065
- pos = pos2;
3780
+ pos = clone(pos2);
3066
3781
  }
3067
3782
  if (result2 === null) {
3068
- if (/^[^>]/.test(input.charAt(pos))) {
3069
- result2 = input.charAt(pos);
3070
- pos++;
3783
+ if (/^[^>]/.test(input.charAt(pos.offset))) {
3784
+ result2 = input.charAt(pos.offset);
3785
+ advance(pos, 1);
3071
3786
  } else {
3072
3787
  result2 = null;
3073
3788
  if (reportFailures === 0) {
@@ -3077,9 +3792,9 @@ smalltalk.parser = (function(){
3077
3792
  }
3078
3793
  }
3079
3794
  if (result1 !== null) {
3080
- if (input.charCodeAt(pos) === 62) {
3795
+ if (input.charCodeAt(pos.offset) === 62) {
3081
3796
  result2 = ">";
3082
- pos++;
3797
+ advance(pos, 1);
3083
3798
  } else {
3084
3799
  result2 = null;
3085
3800
  if (reportFailures === 0) {
@@ -3090,34 +3805,46 @@ smalltalk.parser = (function(){
3090
3805
  result0 = [result0, result1, result2];
3091
3806
  } else {
3092
3807
  result0 = null;
3093
- pos = pos1;
3808
+ pos = clone(pos1);
3094
3809
  }
3095
3810
  } else {
3096
3811
  result0 = null;
3097
- pos = pos1;
3812
+ pos = clone(pos1);
3098
3813
  }
3099
3814
  } else {
3100
3815
  result0 = null;
3101
- pos = pos1;
3816
+ pos = clone(pos1);
3102
3817
  }
3103
3818
  if (result0 !== null) {
3104
- result0 = (function(offset, val) {
3105
- return smalltalk.JSStatementNode._new()
3106
- ._source_(val.join(""))
3107
- })(pos0, result0[1]);
3819
+ result0 = (function(offset, line, column, val) {
3820
+ return smalltalk.JSStatementNode._new()
3821
+ ._source_(val.join(""))
3822
+ })(pos0.offset, pos0.line, pos0.column, result0[1]);
3108
3823
  }
3109
3824
  if (result0 === null) {
3110
- pos = pos0;
3825
+ pos = clone(pos0);
3111
3826
  }
3827
+
3828
+ cache[cacheKey] = {
3829
+ nextPos: clone(pos),
3830
+ result: result0
3831
+ };
3112
3832
  return result0;
3113
3833
  }
3114
3834
 
3115
3835
  function parse_method() {
3836
+ var cacheKey = "method@" + pos.offset;
3837
+ var cachedResult = cache[cacheKey];
3838
+ if (cachedResult) {
3839
+ pos = clone(cachedResult.nextPos);
3840
+ return cachedResult.result;
3841
+ }
3842
+
3116
3843
  var result0, result1, result2, result3, result4;
3117
3844
  var pos0, pos1;
3118
3845
 
3119
- pos0 = pos;
3120
- pos1 = pos;
3846
+ pos0 = clone(pos);
3847
+ pos1 = clone(pos);
3121
3848
  result0 = parse_ws();
3122
3849
  if (result0 !== null) {
3123
3850
  result1 = parse_keywordPattern();
@@ -3138,35 +3865,40 @@ smalltalk.parser = (function(){
3138
3865
  result0 = [result0, result1, result2, result3, result4];
3139
3866
  } else {
3140
3867
  result0 = null;
3141
- pos = pos1;
3868
+ pos = clone(pos1);
3142
3869
  }
3143
3870
  } else {
3144
3871
  result0 = null;
3145
- pos = pos1;
3872
+ pos = clone(pos1);
3146
3873
  }
3147
3874
  } else {
3148
3875
  result0 = null;
3149
- pos = pos1;
3876
+ pos = clone(pos1);
3150
3877
  }
3151
3878
  } else {
3152
3879
  result0 = null;
3153
- pos = pos1;
3880
+ pos = clone(pos1);
3154
3881
  }
3155
3882
  } else {
3156
3883
  result0 = null;
3157
- pos = pos1;
3884
+ pos = clone(pos1);
3158
3885
  }
3159
3886
  if (result0 !== null) {
3160
- result0 = (function(offset, pattern, sequence) {
3161
- return smalltalk.MethodNode._new()
3162
- ._selector_(pattern[0])
3163
- ._arguments_(pattern[1])
3164
- ._nodes_([sequence])
3165
- })(pos0, result0[1], result0[3]);
3887
+ result0 = (function(offset, line, column, pattern, sequence) {
3888
+ return smalltalk.MethodNode._new()
3889
+ ._selector_(pattern[0])
3890
+ ._arguments_(pattern[1])
3891
+ ._nodes_([sequence])
3892
+ })(pos0.offset, pos0.line, pos0.column, result0[1], result0[3]);
3166
3893
  }
3167
3894
  if (result0 === null) {
3168
- pos = pos0;
3895
+ pos = clone(pos0);
3169
3896
  }
3897
+
3898
+ cache[cacheKey] = {
3899
+ nextPos: clone(pos),
3900
+ result: result0
3901
+ };
3170
3902
  return result0;
3171
3903
  }
3172
3904
 
@@ -3185,36 +3917,6 @@ smalltalk.parser = (function(){
3185
3917
  return cleanExpected;
3186
3918
  }
3187
3919
 
3188
- function computeErrorPosition() {
3189
- /*
3190
- * The first idea was to use |String.split| to break the input up to the
3191
- * error position along newlines and derive the line and column from
3192
- * there. However IE's |split| implementation is so broken that it was
3193
- * enough to prevent it.
3194
- */
3195
-
3196
- var line = 1;
3197
- var column = 1;
3198
- var seenCR = false;
3199
-
3200
- for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) {
3201
- var ch = input.charAt(i);
3202
- if (ch === "\n") {
3203
- if (!seenCR) { line++; }
3204
- column = 1;
3205
- seenCR = false;
3206
- } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
3207
- line++;
3208
- column = 1;
3209
- seenCR = true;
3210
- } else {
3211
- column++;
3212
- seenCR = false;
3213
- }
3214
- }
3215
-
3216
- return { line: line, column: column };
3217
- }
3218
3920
 
3219
3921
 
3220
3922
  var result = parseFunctions[startRule]();
@@ -3225,28 +3927,28 @@ smalltalk.parser = (function(){
3225
3927
  * 1. The parser successfully parsed the whole input.
3226
3928
  *
3227
3929
  * - |result !== null|
3228
- * - |pos === input.length|
3930
+ * - |pos.offset === input.length|
3229
3931
  * - |rightmostFailuresExpected| may or may not contain something
3230
3932
  *
3231
3933
  * 2. The parser successfully parsed only a part of the input.
3232
3934
  *
3233
3935
  * - |result !== null|
3234
- * - |pos < input.length|
3936
+ * - |pos.offset < input.length|
3235
3937
  * - |rightmostFailuresExpected| may or may not contain something
3236
3938
  *
3237
3939
  * 3. The parser did not successfully parse any part of the input.
3238
3940
  *
3239
3941
  * - |result === null|
3240
- * - |pos === 0|
3942
+ * - |pos.offset === 0|
3241
3943
  * - |rightmostFailuresExpected| contains at least one failure
3242
3944
  *
3243
3945
  * All code following this comment (including called functions) must
3244
3946
  * handle these states.
3245
3947
  */
3246
- if (result === null || pos !== input.length) {
3247
- var offset = Math.max(pos, rightmostFailuresPos);
3948
+ if (result === null || pos.offset !== input.length) {
3949
+ var offset = Math.max(pos.offset, rightmostFailuresPos.offset);
3248
3950
  var found = offset < input.length ? input.charAt(offset) : null;
3249
- var errorPosition = computeErrorPosition();
3951
+ var errorPosition = pos.offset > rightmostFailuresPos.offset ? pos : rightmostFailuresPos;
3250
3952
 
3251
3953
  throw new this.SyntaxError(
3252
3954
  cleanupExpected(rightmostFailuresExpected),