lvm.js

changeset 104
c481f6bfb19b
parent 103
5a0db53fc898
child 105
fdcc139587a3
equal deleted inserted replaced
103:5a0db53fc898 104:c481f6bfb19b
715 { 715 {
716 return [this.LValue(Math.floor(x.value))]; 716 return [this.LValue(Math.floor(x.value))];
717 } 717 }
718 }; 718 };
719 719
720 var _patternClasses = {
721 "a": "[A-Za-z]", "A": "[^A-Za-z]",
722 "p": "[\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]",
723 "P": "[^\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]",
724 "s": "[\x09-\x0d\x20]", "S": "[^\x09-\x0d\x20]",
725 "u": "[A-Z]", "U": "[^A-Z]",
726 "d": "[0-9]", "D": "[^0-9]",
727 "w": "[0-9A-Za-z]", "W": "[^0-9A-Za-z]",
728 "x": "[0-9A-Fa-f]", "X": "[^0-9A-Fa-f]",
729 "z": "[\x00]", "Z": "[^\x00]",
730 "l": "[a-z]", "L": "[^a-z]",
731 "c": "[\x00-\x1f\x7f]", "C": "[^\x00-\x1f\x7f]",
732 };
733
734 var _patternToRegExp = function (patt)
735 {
736 var regexp = "";
737 for(var i=0;i<patt.length;i++)
738 {
739 var c = patt[i];
740 if(c == "%")
741 {
742 c = patt[++i];
743 if(c == "b")
744 {
745 throw "%b not supported in patterns";
746 }
747 else if(c >= "0" && c <= "9")
748 {
749 regexp += ("\\"+c);
750 continue;
751 }
752 else
753 {
754 var cls = _patternClasses[c];
755 if(cls)
756 {
757 regexp += cls;
758 continue;
759 }
760 }
761 }
762 else if(c == "\\" || c == "/")
763 regexp += "\\"; // Escape escapes
764 regexp += c;
765 }
766 return new RegExp(regexp, "g");
767 };
768
769 var string = {
770 gmatch: function (str, patt)
771 {
772 var re = _patternToRegExp(patt.value);
773 var matches = str.value.match(re)||[];
774 sys.puts("MATCHES: "+str+" "+matches.length);
775 var curr = 0;
776 var iter = function ()
777 {
778 return [this.LValue(matches[curr++])];
779 };
780 return [this.LValue(iter)];
781 }
782 };
720 testvm.registerLib(_G, null, baselib); 783 testvm.registerLib(_G, null, baselib);
721 testvm.registerLib(_G, "math", math); 784 testvm.registerLib(_G, "math", math);
785 testvm.registerLib(_G, "string", string);
722 786
723 // Metatable on environment to print out nil global accesses 787 // Metatable on environment to print out nil global accesses
724 var mt = testvm.LValue({}); 788 var mt = testvm.LValue({});
725 mt.setIndex( 789 mt.setIndex(
726 testvm.LValue("__index"), 790 testvm.LValue("__index"),

mercurial