@holoscript/core 2.0.2 → 2.1.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.
- package/dist/{chunk-KWYIVRIH.js → chunk-2XXE34KS.js} +2 -2
- package/dist/chunk-2XXE34KS.js.map +1 -0
- package/dist/{chunk-EU6CZMGJ.js → chunk-AFFVFO4D.js} +511 -118
- package/dist/chunk-AFFVFO4D.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/{chunk-4CV4JOE5.js.map → chunk-DGUM43GV.js.map} +1 -1
- package/dist/{chunk-VYIDLUCV.js → chunk-DOY73HDH.js} +4 -4
- package/dist/{chunk-VYIDLUCV.js.map → chunk-DOY73HDH.js.map} +1 -1
- package/dist/chunk-JEQ2X3Z6.cjs +12 -0
- package/dist/{chunk-CZLDE2OZ.cjs.map → chunk-JEQ2X3Z6.cjs.map} +1 -1
- package/dist/{chunk-3N67RLQP.cjs → chunk-L6VLNVKP.cjs} +511 -118
- package/dist/chunk-L6VLNVKP.cjs.map +1 -0
- package/dist/{chunk-VMZN4EVR.cjs → chunk-MFNO57XL.cjs} +2 -2
- package/dist/chunk-MFNO57XL.cjs.map +1 -0
- package/dist/{chunk-WFI4T3XB.cjs → chunk-R75MREOS.cjs} +6 -6
- package/dist/{chunk-WFI4T3XB.cjs.map → chunk-R75MREOS.cjs.map} +1 -1
- package/dist/{chunk-4OHVW4XR.cjs → chunk-T57ZL7KR.cjs} +299 -45
- package/dist/chunk-T57ZL7KR.cjs.map +1 -0
- package/dist/{chunk-MCP6D4LT.js → chunk-U72GEJZT.js} +299 -45
- package/dist/chunk-U72GEJZT.js.map +1 -0
- package/dist/debugger.cjs +6 -6
- package/dist/debugger.d.cts +1 -1
- package/dist/debugger.d.ts +1 -1
- package/dist/debugger.js +4 -4
- package/dist/index.cjs +1896 -1099
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3145 -1534
- package/dist/index.d.ts +3145 -1534
- package/dist/index.js +1922 -1133
- package/dist/index.js.map +1 -1
- package/dist/parser.cjs +3 -3
- package/dist/parser.d.cts +34 -1
- package/dist/parser.d.ts +34 -1
- package/dist/parser.js +2 -2
- package/dist/runtime.cjs +3 -3
- package/dist/runtime.d.cts +47 -27
- package/dist/runtime.d.ts +47 -27
- package/dist/runtime.js +2 -2
- package/dist/type-checker.cjs +4 -4
- package/dist/type-checker.d.cts +3 -3
- package/dist/type-checker.d.ts +3 -3
- package/dist/type-checker.js +2 -2
- package/dist/{types-D6g4ACjP.d.cts → types-4h8cbtF_.d.cts} +80 -13
- package/dist/{types-D6g4ACjP.d.ts → types-4h8cbtF_.d.ts} +80 -13
- package/package.json +21 -20
- package/LICENSE +0 -21
- package/dist/chunk-3N67RLQP.cjs.map +0 -1
- package/dist/chunk-4CV4JOE5.js +0 -24
- package/dist/chunk-4OHVW4XR.cjs.map +0 -1
- package/dist/chunk-CZLDE2OZ.cjs +0 -28
- package/dist/chunk-EU6CZMGJ.js.map +0 -1
- package/dist/chunk-KWYIVRIH.js.map +0 -1
- package/dist/chunk-MCP6D4LT.js.map +0 -1
- package/dist/chunk-VMZN4EVR.cjs.map +0 -1
|
@@ -79,7 +79,14 @@ var HoloScriptCodeParser = class {
|
|
|
79
79
|
"pulse",
|
|
80
80
|
"move",
|
|
81
81
|
"show",
|
|
82
|
-
"hide"
|
|
82
|
+
"hide",
|
|
83
|
+
"scale",
|
|
84
|
+
"focus",
|
|
85
|
+
"environment",
|
|
86
|
+
"composition",
|
|
87
|
+
"template",
|
|
88
|
+
"settings",
|
|
89
|
+
"chat"
|
|
83
90
|
]);
|
|
84
91
|
}
|
|
85
92
|
/**
|
|
@@ -217,7 +224,7 @@ var HoloScriptCodeParser = class {
|
|
|
217
224
|
}
|
|
218
225
|
}
|
|
219
226
|
if (foundMultiOp) continue;
|
|
220
|
-
const punctuation = ["{", "}", "(", ")", "[", "]", ":", ",", ".", ";", "=", "<", ">", "+", "-", "*", "/", "%", "!", "&", "|", "?"];
|
|
227
|
+
const punctuation = ["{", "}", "(", ")", "[", "]", ":", ",", ".", ";", "=", "<", ">", "+", "-", "*", "/", "%", "!", "&", "|", "?", "#", "@"];
|
|
221
228
|
if (punctuation.includes(char)) {
|
|
222
229
|
tokens.push({ type: "punctuation", value: char, line, column });
|
|
223
230
|
i++;
|
|
@@ -261,6 +268,7 @@ var HoloScriptCodeParser = class {
|
|
|
261
268
|
if (token.type === "keyword") {
|
|
262
269
|
switch (token.value.toLowerCase()) {
|
|
263
270
|
case "orb":
|
|
271
|
+
case "object":
|
|
264
272
|
return this.parseOrb();
|
|
265
273
|
case "function":
|
|
266
274
|
return this.parseFunction();
|
|
@@ -307,6 +315,20 @@ var HoloScriptCodeParser = class {
|
|
|
307
315
|
return this.parseAnimate();
|
|
308
316
|
case "modify":
|
|
309
317
|
return this.parseModify();
|
|
318
|
+
case "scale":
|
|
319
|
+
return this.parseScale();
|
|
320
|
+
case "focus":
|
|
321
|
+
return this.parseFocus();
|
|
322
|
+
case "environment":
|
|
323
|
+
return this.parseEnvironment();
|
|
324
|
+
case "composition":
|
|
325
|
+
return this.parseComposition();
|
|
326
|
+
case "template":
|
|
327
|
+
return this.parseTemplate();
|
|
328
|
+
case "settings":
|
|
329
|
+
return this.parseSettings();
|
|
330
|
+
case "chat":
|
|
331
|
+
return this.parseChat();
|
|
310
332
|
default:
|
|
311
333
|
this.advance();
|
|
312
334
|
return null;
|
|
@@ -562,10 +584,21 @@ var HoloScriptCodeParser = class {
|
|
|
562
584
|
* Parse orb declaration
|
|
563
585
|
*/
|
|
564
586
|
parseOrb() {
|
|
565
|
-
this.
|
|
566
|
-
|
|
567
|
-
|
|
587
|
+
const startToken = this.currentToken();
|
|
588
|
+
if (this.check("keyword", "orb") || this.check("keyword", "object")) {
|
|
589
|
+
this.advance();
|
|
590
|
+
} else {
|
|
591
|
+
this.expect("keyword", "orb");
|
|
592
|
+
}
|
|
593
|
+
let name = "";
|
|
594
|
+
if (this.check("punctuation", "#")) {
|
|
595
|
+
this.advance();
|
|
596
|
+
name = this.expectIdentifier() || `orb_${Date.now()}`;
|
|
597
|
+
} else {
|
|
598
|
+
name = this.expectIdentifier() || `orb_${Date.now()}`;
|
|
599
|
+
}
|
|
568
600
|
const properties = {};
|
|
601
|
+
const directives = [];
|
|
569
602
|
let position;
|
|
570
603
|
let hologram;
|
|
571
604
|
if (this.check("punctuation", "{")) {
|
|
@@ -573,17 +606,23 @@ var HoloScriptCodeParser = class {
|
|
|
573
606
|
while (!this.check("punctuation", "}") && this.position < this.tokens.length) {
|
|
574
607
|
this.skipNewlines();
|
|
575
608
|
if (this.check("punctuation", "}")) break;
|
|
576
|
-
const
|
|
577
|
-
if (
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
if (prop.key === "
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
609
|
+
const token = this.currentToken();
|
|
610
|
+
if (token?.type === "punctuation" && token.value === "@") {
|
|
611
|
+
const directive = this.parseDirective();
|
|
612
|
+
if (directive) directives.push(directive);
|
|
613
|
+
} else {
|
|
614
|
+
const prop = this.parseProperty();
|
|
615
|
+
if (prop) {
|
|
616
|
+
if (prop.key === "position" || prop.key === "at") {
|
|
617
|
+
position = this.parsePosition(prop.value);
|
|
618
|
+
} else if (prop.key === "color" || prop.key === "glow" || prop.key === "size") {
|
|
619
|
+
hologram = hologram || { shape: "orb", color: "#00ffff", size: 0.5, glow: true, interactive: true };
|
|
620
|
+
if (prop.key === "color") hologram.color = String(prop.value);
|
|
621
|
+
if (prop.key === "glow") hologram.glow = Boolean(prop.value);
|
|
622
|
+
if (prop.key === "size") hologram.size = Number(prop.value);
|
|
623
|
+
} else {
|
|
624
|
+
properties[prop.key] = prop.value;
|
|
625
|
+
}
|
|
587
626
|
}
|
|
588
627
|
}
|
|
589
628
|
this.skipNewlines();
|
|
@@ -594,11 +633,60 @@ var HoloScriptCodeParser = class {
|
|
|
594
633
|
type: "orb",
|
|
595
634
|
name,
|
|
596
635
|
position: position || { x: 0, y: 0, z: 0 },
|
|
597
|
-
hologram: hologram || { shape: "orb", color: "#00ffff", size:
|
|
636
|
+
hologram: hologram || { shape: "orb", color: "#00ffff", size: 0.5, glow: true, interactive: true },
|
|
598
637
|
properties,
|
|
599
|
-
|
|
638
|
+
directives,
|
|
639
|
+
methods: [],
|
|
640
|
+
line: startToken?.line || 0
|
|
600
641
|
};
|
|
601
642
|
}
|
|
643
|
+
/**
|
|
644
|
+
* Parse HoloScript+ directive: @name(...) or @name { ... }
|
|
645
|
+
*/
|
|
646
|
+
parseDirective() {
|
|
647
|
+
this.expect("punctuation", "@");
|
|
648
|
+
const name = this.expectIdentifier();
|
|
649
|
+
if (!name) return null;
|
|
650
|
+
if (name === "state") {
|
|
651
|
+
const body = this.parseObject();
|
|
652
|
+
return { type: "state", body };
|
|
653
|
+
}
|
|
654
|
+
if (name.startsWith("on_")) {
|
|
655
|
+
let body = "";
|
|
656
|
+
if (this.check("punctuation", "{")) {
|
|
657
|
+
this.advance();
|
|
658
|
+
let braceDepth = 1;
|
|
659
|
+
while (braceDepth > 0 && this.position < this.tokens.length) {
|
|
660
|
+
const t = this.advance();
|
|
661
|
+
if (t.value === "{") braceDepth++;
|
|
662
|
+
if (t.value === "}") braceDepth--;
|
|
663
|
+
if (braceDepth > 0) body += t.value + " ";
|
|
664
|
+
else if (braceDepth < 0) break;
|
|
665
|
+
}
|
|
666
|
+
} else {
|
|
667
|
+
const t = this.advance();
|
|
668
|
+
if (t) body = t.value;
|
|
669
|
+
}
|
|
670
|
+
return { type: "lifecycle", hook: name, body };
|
|
671
|
+
}
|
|
672
|
+
let config = {};
|
|
673
|
+
if (this.check("punctuation", "(")) {
|
|
674
|
+
this.advance();
|
|
675
|
+
while (!this.check("punctuation", ")") && this.position < this.tokens.length) {
|
|
676
|
+
const prop = this.parseProperty();
|
|
677
|
+
if (prop) {
|
|
678
|
+
config[prop.key] = prop.value;
|
|
679
|
+
}
|
|
680
|
+
if (this.check("punctuation", ",")) {
|
|
681
|
+
this.advance();
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
this.expect("punctuation", ")");
|
|
685
|
+
} else if (this.check("punctuation", "{")) {
|
|
686
|
+
config = this.parseObject();
|
|
687
|
+
}
|
|
688
|
+
return { type: "trait", name, config };
|
|
689
|
+
}
|
|
602
690
|
/**
|
|
603
691
|
* Parse function declaration
|
|
604
692
|
*/
|
|
@@ -680,6 +768,135 @@ var HoloScriptCodeParser = class {
|
|
|
680
768
|
bidirectional: false
|
|
681
769
|
};
|
|
682
770
|
}
|
|
771
|
+
/**
|
|
772
|
+
* Parse scale block: scale <magnitude> { body }
|
|
773
|
+
*/
|
|
774
|
+
parseScale() {
|
|
775
|
+
this.expect("keyword", "scale");
|
|
776
|
+
const magnitude = this.expectIdentifier() || "standard";
|
|
777
|
+
const multipliers = {
|
|
778
|
+
"galactic": 1e6,
|
|
779
|
+
"macro": 1e3,
|
|
780
|
+
"standard": 1,
|
|
781
|
+
"micro": 1e-3,
|
|
782
|
+
"atomic": 1e-6
|
|
783
|
+
};
|
|
784
|
+
const body = [];
|
|
785
|
+
if (this.check("punctuation", "{")) {
|
|
786
|
+
this.advance();
|
|
787
|
+
while (!this.check("punctuation", "}") && this.position < this.tokens.length) {
|
|
788
|
+
this.skipNewlines();
|
|
789
|
+
const node = this.parseDeclaration();
|
|
790
|
+
if (node) body.push(node);
|
|
791
|
+
this.skipNewlines();
|
|
792
|
+
}
|
|
793
|
+
this.expect("punctuation", "}");
|
|
794
|
+
}
|
|
795
|
+
return {
|
|
796
|
+
type: "scale",
|
|
797
|
+
magnitude,
|
|
798
|
+
multiplier: multipliers[magnitude] || 1,
|
|
799
|
+
body,
|
|
800
|
+
position: { x: 0, y: 0, z: 0 }
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Parse focus block: focus <target> { body }
|
|
805
|
+
*/
|
|
806
|
+
parseFocus() {
|
|
807
|
+
this.expect("keyword", "focus");
|
|
808
|
+
const target = this.expectIdentifier() || "origin";
|
|
809
|
+
const body = [];
|
|
810
|
+
if (this.check("punctuation", "{")) {
|
|
811
|
+
this.advance();
|
|
812
|
+
while (!this.check("punctuation", "}") && this.position < this.tokens.length) {
|
|
813
|
+
this.skipNewlines();
|
|
814
|
+
const node = this.parseDeclaration();
|
|
815
|
+
if (node) body.push(node);
|
|
816
|
+
this.skipNewlines();
|
|
817
|
+
}
|
|
818
|
+
this.expect("punctuation", "}");
|
|
819
|
+
}
|
|
820
|
+
return {
|
|
821
|
+
type: "focus",
|
|
822
|
+
target,
|
|
823
|
+
body,
|
|
824
|
+
position: { x: 0, y: 0, z: 0 }
|
|
825
|
+
};
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Parse environment declaration
|
|
829
|
+
*/
|
|
830
|
+
parseEnvironment() {
|
|
831
|
+
this.expect("keyword", "environment");
|
|
832
|
+
const settings = {};
|
|
833
|
+
while (this.position < this.tokens.length && this.currentToken()?.type !== "newline" && !this.check("punctuation", "}")) {
|
|
834
|
+
const key = this.expectIdentifier();
|
|
835
|
+
if (!key) break;
|
|
836
|
+
settings[key] = this.parseLiteral();
|
|
837
|
+
}
|
|
838
|
+
return {
|
|
839
|
+
type: "environment",
|
|
840
|
+
settings
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
/**
|
|
844
|
+
* Parse composition block
|
|
845
|
+
*/
|
|
846
|
+
parseComposition() {
|
|
847
|
+
this.expect("keyword", "composition");
|
|
848
|
+
const name = this.expectIdentifier() || "unnamed";
|
|
849
|
+
const children = [];
|
|
850
|
+
if (this.check("punctuation", "{")) {
|
|
851
|
+
this.advance();
|
|
852
|
+
while (!this.check("punctuation", "}") && this.position < this.tokens.length) {
|
|
853
|
+
this.skipNewlines();
|
|
854
|
+
const node = this.parseDeclaration();
|
|
855
|
+
if (node) children.push(node);
|
|
856
|
+
this.skipNewlines();
|
|
857
|
+
}
|
|
858
|
+
this.expect("punctuation", "}");
|
|
859
|
+
}
|
|
860
|
+
return {
|
|
861
|
+
type: "composition",
|
|
862
|
+
name,
|
|
863
|
+
children
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
/**
|
|
867
|
+
* Parse template declaration
|
|
868
|
+
*/
|
|
869
|
+
parseTemplate() {
|
|
870
|
+
this.expect("keyword", "template");
|
|
871
|
+
const name = this.expectIdentifier() || "template";
|
|
872
|
+
const params = [];
|
|
873
|
+
if (this.check("punctuation", "(")) {
|
|
874
|
+
this.advance();
|
|
875
|
+
while (!this.check("punctuation", ")") && this.position < this.tokens.length) {
|
|
876
|
+
const p = this.expectIdentifier();
|
|
877
|
+
if (p) params.push(p);
|
|
878
|
+
if (this.check("punctuation", ",")) this.advance();
|
|
879
|
+
}
|
|
880
|
+
this.expect("punctuation", ")");
|
|
881
|
+
}
|
|
882
|
+
const body = [];
|
|
883
|
+
if (this.check("punctuation", "{")) {
|
|
884
|
+
this.advance();
|
|
885
|
+
while (!this.check("punctuation", "}") && this.position < this.tokens.length) {
|
|
886
|
+
this.skipNewlines();
|
|
887
|
+
const node = this.parseDeclaration();
|
|
888
|
+
if (node) body.push(node);
|
|
889
|
+
this.skipNewlines();
|
|
890
|
+
}
|
|
891
|
+
this.expect("punctuation", "}");
|
|
892
|
+
}
|
|
893
|
+
return {
|
|
894
|
+
type: "template",
|
|
895
|
+
name,
|
|
896
|
+
parameters: params,
|
|
897
|
+
body
|
|
898
|
+
};
|
|
899
|
+
}
|
|
683
900
|
/**
|
|
684
901
|
* Parse gate (conditional)
|
|
685
902
|
*/
|
|
@@ -788,6 +1005,37 @@ var HoloScriptCodeParser = class {
|
|
|
788
1005
|
hologram: { shape: "cube", color: "#e74c3c", size: 4, glow: true, interactive: true }
|
|
789
1006
|
};
|
|
790
1007
|
}
|
|
1008
|
+
/**
|
|
1009
|
+
* Parse a literal value (string, number, boolean, array, or object)
|
|
1010
|
+
*/
|
|
1011
|
+
parseLiteral() {
|
|
1012
|
+
const token = this.currentToken();
|
|
1013
|
+
if (!token) return null;
|
|
1014
|
+
if (token.type === "string") {
|
|
1015
|
+
this.advance();
|
|
1016
|
+
return token.value;
|
|
1017
|
+
}
|
|
1018
|
+
if (token.type === "number") {
|
|
1019
|
+
this.advance();
|
|
1020
|
+
return parseFloat(token.value);
|
|
1021
|
+
}
|
|
1022
|
+
if (token.type === "identifier") {
|
|
1023
|
+
const val = token.value.toLowerCase();
|
|
1024
|
+
this.advance();
|
|
1025
|
+
if (val === "true") return true;
|
|
1026
|
+
if (val === "false") return false;
|
|
1027
|
+
if (val === "null") return null;
|
|
1028
|
+
return token.value;
|
|
1029
|
+
}
|
|
1030
|
+
if (this.check("punctuation", "[")) {
|
|
1031
|
+
return this.parseArray();
|
|
1032
|
+
}
|
|
1033
|
+
if (this.check("punctuation", "{")) {
|
|
1034
|
+
return this.parseObject();
|
|
1035
|
+
}
|
|
1036
|
+
this.advance();
|
|
1037
|
+
return token.value;
|
|
1038
|
+
}
|
|
791
1039
|
/**
|
|
792
1040
|
* Parse a property (key: value)
|
|
793
1041
|
*/
|
|
@@ -798,28 +1046,7 @@ var HoloScriptCodeParser = class {
|
|
|
798
1046
|
return { key, value: true };
|
|
799
1047
|
}
|
|
800
1048
|
this.advance();
|
|
801
|
-
const
|
|
802
|
-
if (!valueToken) return null;
|
|
803
|
-
let value;
|
|
804
|
-
if (valueToken.type === "string") {
|
|
805
|
-
value = valueToken.value;
|
|
806
|
-
this.advance();
|
|
807
|
-
} else if (valueToken.type === "number") {
|
|
808
|
-
value = parseFloat(valueToken.value);
|
|
809
|
-
this.advance();
|
|
810
|
-
} else if (valueToken.type === "identifier") {
|
|
811
|
-
if (valueToken.value === "true") value = true;
|
|
812
|
-
else if (valueToken.value === "false") value = false;
|
|
813
|
-
else value = valueToken.value;
|
|
814
|
-
this.advance();
|
|
815
|
-
} else if (this.check("punctuation", "[")) {
|
|
816
|
-
value = this.parseArray();
|
|
817
|
-
} else if (this.check("punctuation", "{")) {
|
|
818
|
-
value = this.parseObject();
|
|
819
|
-
} else {
|
|
820
|
-
value = valueToken.value;
|
|
821
|
-
this.advance();
|
|
822
|
-
}
|
|
1049
|
+
const value = this.parseLiteral();
|
|
823
1050
|
return { key, value };
|
|
824
1051
|
}
|
|
825
1052
|
/**
|
|
@@ -870,6 +1097,13 @@ var HoloScriptCodeParser = class {
|
|
|
870
1097
|
* Parse position from value
|
|
871
1098
|
*/
|
|
872
1099
|
parsePosition(value) {
|
|
1100
|
+
if (Array.isArray(value)) {
|
|
1101
|
+
return {
|
|
1102
|
+
x: Number(value[0]) || 0,
|
|
1103
|
+
y: Number(value[1]) || 0,
|
|
1104
|
+
z: Number(value[2]) || 0
|
|
1105
|
+
};
|
|
1106
|
+
}
|
|
873
1107
|
if (typeof value === "object" && value !== null) {
|
|
874
1108
|
const v = value;
|
|
875
1109
|
return {
|
|
@@ -981,15 +1215,16 @@ var HoloScriptCodeParser = class {
|
|
|
981
1215
|
const elementType = typeToken.value;
|
|
982
1216
|
this.advance();
|
|
983
1217
|
let elementId = `${elementType}_${Date.now()}`;
|
|
984
|
-
|
|
1218
|
+
const token = this.currentToken();
|
|
1219
|
+
if (token?.type === "punctuation" && token.value === "#") {
|
|
985
1220
|
this.advance();
|
|
986
1221
|
const idToken = this.currentToken();
|
|
987
1222
|
if (idToken) {
|
|
988
1223
|
elementId = idToken.value;
|
|
989
1224
|
this.advance();
|
|
990
1225
|
}
|
|
991
|
-
} else if (
|
|
992
|
-
elementId =
|
|
1226
|
+
} else if (token?.type === "identifier" && token.value.startsWith("#")) {
|
|
1227
|
+
elementId = token.value.slice(1) || elementId;
|
|
993
1228
|
this.advance();
|
|
994
1229
|
}
|
|
995
1230
|
const properties = {};
|
|
@@ -1013,6 +1248,25 @@ var HoloScriptCodeParser = class {
|
|
|
1013
1248
|
position: { x: 0, y: 0, z: 0 }
|
|
1014
1249
|
};
|
|
1015
1250
|
}
|
|
1251
|
+
/**
|
|
1252
|
+
* Parse settings command: settings
|
|
1253
|
+
*/
|
|
1254
|
+
parseSettings() {
|
|
1255
|
+
this.expect("keyword", "settings");
|
|
1256
|
+
return {
|
|
1257
|
+
type: "expression-statement",
|
|
1258
|
+
expression: "showSettings()",
|
|
1259
|
+
position: { x: 0, y: 0, z: 0 }
|
|
1260
|
+
};
|
|
1261
|
+
}
|
|
1262
|
+
parseChat() {
|
|
1263
|
+
this.expect("keyword", "chat");
|
|
1264
|
+
return {
|
|
1265
|
+
type: "expression-statement",
|
|
1266
|
+
expression: "openChat()",
|
|
1267
|
+
position: { x: 0, y: 0, z: 0 }
|
|
1268
|
+
};
|
|
1269
|
+
}
|
|
1016
1270
|
skipNewlines() {
|
|
1017
1271
|
while (this.currentToken()?.type === "newline") {
|
|
1018
1272
|
this.advance();
|
|
@@ -1021,5 +1275,5 @@ var HoloScriptCodeParser = class {
|
|
|
1021
1275
|
};
|
|
1022
1276
|
|
|
1023
1277
|
export { HoloScriptCodeParser };
|
|
1024
|
-
//# sourceMappingURL=chunk-
|
|
1025
|
-
//# sourceMappingURL=chunk-
|
|
1278
|
+
//# sourceMappingURL=chunk-U72GEJZT.js.map
|
|
1279
|
+
//# sourceMappingURL=chunk-U72GEJZT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/HoloScriptCodeParser.ts"],"names":["exports"],"mappings":"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","file":"chunk-U72GEJZT.js","sourcesContent":["/**\r\n * HoloScript Code Parser\r\n *\r\n * Parses HoloScript code strings into AST nodes that can be executed\r\n * by the HoloScriptRuntime.\r\n *\r\n * Syntax Reference:\r\n * - orb <name> { properties }\r\n * - function <name>(<params>): <return> { body }\r\n * - connect <from> to <to> [as <type>]\r\n * - gate <name> { condition, true_path, false_path }\r\n * - stream <name> from <source> { transformations }\r\n */\r\n\r\nimport { logger } from './logger';\r\nimport type {\r\n ASTNode,\r\n OrbNode,\r\n MethodNode,\r\n ParameterNode,\r\n ConnectionNode,\r\n GateNode,\r\n StreamNode,\r\n SpatialPosition,\r\n HologramProperties,\r\n ForLoopNode,\r\n WhileLoopNode,\r\n ForEachLoopNode,\r\n ImportNode,\r\n ExportNode,\r\n VariableDeclarationNode,\r\n ScaleNode,\r\n FocusNode,\r\n EnvironmentNode,\r\n TemplateNode,\r\n HoloScriptValue,\r\n HSPlusDirective,\r\n} from './types';\r\ntype CompositionNode = any;\r\ntype TransformationNode = any;\r\n// @ts-ignore\r\nconst _c: CompositionNode = {} as any;\r\n// @ts-ignore\r\nconst _t: TransformationNode = {} as any;\r\n\r\n// Security configuration\r\nconst CODE_SECURITY_CONFIG = {\r\n maxCodeLength: 50000,\r\n maxBlocks: 100,\r\n maxNestingDepth: 10,\r\n suspiciousKeywords: [\r\n 'process', 'require', 'eval', 'import', 'constructor',\r\n 'prototype', '__proto__', 'fs', 'child_process', 'exec', 'spawn',\r\n ],\r\n};\r\n\r\nexport interface ParseResult {\r\n success: boolean;\r\n ast: ASTNode[];\r\n errors: ParseError[];\r\n warnings: string[];\r\n}\r\n\r\nexport interface ParseError {\r\n line: number;\r\n column: number;\r\n message: string;\r\n}\r\n\r\ninterface Token {\r\n type: 'keyword' | 'identifier' | 'number' | 'string' | 'operator' | 'punctuation' | 'newline';\r\n value: string;\r\n line: number;\r\n column: number;\r\n}\r\n\r\nexport class HoloScriptCodeParser {\r\n private errors: ParseError[] = [];\r\n private warnings: string[] = [];\r\n private tokens: Token[] = [];\r\n private position: number = 0;\r\n private keywordSet: Set<string>;\r\n\r\n constructor() {\r\n // Pre-compute keyword set for O(1) lookup instead of O(n) array search\r\n this.keywordSet = new Set([\r\n 'orb', 'function', 'connect', 'to', 'as', 'gate', 'stream', 'from', 'through', 'return',\r\n 'if', 'else', 'nexus', 'building', 'pillar', 'foundation',\r\n 'for', 'while', 'forEach', 'in', 'of', 'break', 'continue',\r\n 'import', 'export', 'module', 'use',\r\n 'type', 'interface', 'extends', 'implements',\r\n 'async', 'await', 'spawn', 'parallel',\r\n 'class', 'new', 'this', 'super', 'static', 'private', 'public',\r\n 'try', 'catch', 'finally', 'throw',\r\n 'const', 'let', 'var',\r\n 'animate', 'modify', 'pulse', 'move', 'show', 'hide',\r\n 'scale', 'focus', 'environment', 'composition', 'template', 'settings', 'chat'\r\n ]);\r\n }\r\n\r\n /**\r\n * Parse HoloScript code string into AST\r\n */\r\n parse(code: string): ParseResult {\r\n this.errors = [];\r\n this.warnings = [];\r\n this.tokens = [];\r\n this.position = 0;\r\n\r\n // Security: Check code length\r\n if (code.length > CODE_SECURITY_CONFIG.maxCodeLength) {\r\n return {\r\n success: false,\r\n ast: [],\r\n errors: [{ line: 0, column: 0, message: `Code exceeds max length (${CODE_SECURITY_CONFIG.maxCodeLength})` }],\r\n warnings: [],\r\n };\r\n }\r\n\r\n // Security: Check for suspicious keywords\r\n for (const keyword of CODE_SECURITY_CONFIG.suspiciousKeywords) {\r\n if (code.toLowerCase().includes(keyword)) {\r\n logger.warn('Suspicious keyword detected', { keyword });\r\n return {\r\n success: false,\r\n ast: [],\r\n errors: [{ line: 0, column: 0, message: `Suspicious keyword detected: ${keyword}` }],\r\n warnings: [],\r\n };\r\n }\r\n }\r\n\r\n try {\r\n // Tokenize\r\n this.tokens = this.tokenize(code);\r\n\r\n // Parse tokens into AST\r\n const ast = this.parseProgram();\r\n\r\n return {\r\n success: this.errors.length === 0,\r\n ast,\r\n errors: this.errors,\r\n warnings: this.warnings,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n ast: [],\r\n errors: [{ line: 0, column: 0, message: String(error) }],\r\n warnings: this.warnings,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Tokenize code into tokens\r\n */\r\n private tokenize(code: string): Token[] {\r\n const tokens: Token[] = [];\r\n let line = 1;\r\n let column = 1;\r\n let i = 0;\r\n\r\n while (i < code.length) {\r\n const char = code[i];\r\n\r\n // Skip whitespace (except newlines)\r\n if (char === ' ' || char === '\\t' || char === '\\r') {\r\n i++;\r\n column++;\r\n continue;\r\n }\r\n\r\n // Newline\r\n if (char === '\\n') {\r\n tokens.push({ type: 'newline', value: '\\n', line, column });\r\n line++;\r\n column = 1;\r\n i++;\r\n continue;\r\n }\r\n\r\n // Comments (skip)\r\n if (char === '/' && code[i + 1] === '/') {\r\n while (i < code.length && code[i] !== '\\n') {\r\n i++;\r\n }\r\n continue;\r\n }\r\n\r\n // String\r\n if (char === '\"' || char === \"'\") {\r\n const quote = char;\r\n let str = '';\r\n const startCol = column;\r\n i++;\r\n column++;\r\n\r\n while (i < code.length && code[i] !== quote) {\r\n if (code[i] === '\\\\' && i + 1 < code.length) {\r\n str += code[i + 1];\r\n i += 2;\r\n column += 2;\r\n } else {\r\n str += code[i];\r\n i++;\r\n column++;\r\n }\r\n }\r\n\r\n i++; // Skip closing quote\r\n column++;\r\n\r\n tokens.push({ type: 'string', value: str, line, column: startCol });\r\n continue;\r\n }\r\n\r\n // Number\r\n if (/[0-9]/.test(char) || (char === '-' && /[0-9]/.test(code[i + 1]))) {\r\n let num = '';\r\n const startCol = column;\r\n\r\n while (i < code.length && /[0-9.\\-]/.test(code[i])) {\r\n num += code[i];\r\n i++;\r\n column++;\r\n }\r\n\r\n tokens.push({ type: 'number', value: num, line, column: startCol });\r\n continue;\r\n }\r\n\r\n // Identifier or keyword\r\n if (/[a-zA-Z_]/.test(char)) {\r\n let ident = '';\r\n const startCol = column;\r\n\r\n while (i < code.length && /[a-zA-Z0-9_]/.test(code[i])) {\r\n ident += code[i];\r\n i++;\r\n column++;\r\n }\r\n\r\n const isKeyword = this.keywordSet.has(ident.toLowerCase());\r\n tokens.push({\r\n type: isKeyword ? 'keyword' : 'identifier',\r\n value: ident,\r\n line,\r\n column: startCol,\r\n });\r\n continue;\r\n }\r\n\r\n // Multi-character operators (must check before single-char)\r\n const multiCharOps = ['===', '!==', '==', '!=', '>=', '<=', '&&', '||', '++', '--', '+=', '-=', '*=', '/=', '%=', '=>', '->'];\r\n let foundMultiOp = false;\r\n for (const op of multiCharOps) {\r\n if (code.substring(i, i + op.length) === op) {\r\n tokens.push({ type: 'operator', value: op, line, column });\r\n i += op.length;\r\n column += op.length;\r\n foundMultiOp = true;\r\n break;\r\n }\r\n }\r\n if (foundMultiOp) continue;\r\n\r\n // Operators and punctuation\r\n const punctuation = ['{', '}', '(', ')', '[', ']', ':', ',', '.', ';', '=', '<', '>', '+', '-', '*', '/', '%', '!', '&', '|', '?', '#', '@'];\r\n if (punctuation.includes(char)) {\r\n tokens.push({ type: 'punctuation', value: char, line, column });\r\n i++;\r\n column++;\r\n continue;\r\n }\r\n\r\n // Unknown character - skip\r\n i++;\r\n column++;\r\n }\r\n\r\n return tokens;\r\n }\r\n\r\n /**\r\n * Parse program (list of declarations)\r\n */\r\n private parseProgram(): ASTNode[] {\r\n const nodes: ASTNode[] = [];\r\n let blockCount = 0;\r\n\r\n while (this.position < this.tokens.length) {\r\n // Skip newlines\r\n while (this.currentToken()?.type === 'newline') {\r\n this.advance();\r\n }\r\n\r\n if (this.position >= this.tokens.length) break;\r\n\r\n // Security: limit blocks\r\n blockCount++;\r\n if (blockCount > CODE_SECURITY_CONFIG.maxBlocks) {\r\n this.errors.push({ line: 0, column: 0, message: 'Too many blocks in program' });\r\n break;\r\n }\r\n\r\n const node = this.parseDeclaration();\r\n if (node) {\r\n nodes.push(node);\r\n }\r\n }\r\n\r\n return nodes;\r\n }\r\n\r\n /**\r\n * Parse a single declaration\r\n */\r\n private parseDeclaration(): ASTNode | null {\r\n const token = this.currentToken();\r\n if (!token) return null;\r\n\r\n if (token.type === 'keyword') {\r\n switch (token.value.toLowerCase()) {\r\n case 'orb':\r\n case 'object':\r\n return this.parseOrb();\r\n case 'function':\r\n return this.parseFunction();\r\n case 'connect':\r\n return this.parseConnection();\r\n case 'gate':\r\n case 'if':\r\n return this.parseGate();\r\n case 'stream':\r\n return this.parseStream();\r\n case 'nexus':\r\n return this.parseNexus();\r\n case 'building':\r\n case 'class':\r\n return this.parseBuilding();\r\n // Phase 2: Loop constructs\r\n case 'for':\r\n return this.parseForLoop();\r\n case 'while':\r\n return this.parseWhileLoop();\r\n case 'foreach':\r\n return this.parseForEachLoop();\r\n // Phase 2: Module system\r\n case 'import':\r\n return this.parseImport();\r\n case 'export':\r\n return this.parseExport();\r\n // Phase 2: Variable declarations\r\n // UI Extensions\r\n case 'ui2d':\r\n case 'card':\r\n case 'metric':\r\n case 'button':\r\n case 'row':\r\n case 'col':\r\n case 'text':\r\n return this.parseUIElement();\r\n case 'const':\r\n case 'let':\r\n case 'var':\r\n return this.parseVariableDeclaration();\r\n // DSL-first commands (Phase 54)\r\n case 'animate':\r\n return this.parseAnimate();\r\n case 'modify':\r\n return this.parseModify();\r\n case 'scale':\r\n return this.parseScale();\r\n case 'focus':\r\n return this.parseFocus();\r\n case 'environment':\r\n return this.parseEnvironment();\r\n case 'composition':\r\n return this.parseComposition();\r\n case 'template':\r\n return this.parseTemplate();\r\n case 'settings':\r\n return this.parseSettings();\r\n case 'chat':\r\n return this.parseChat();\r\n default:\r\n this.advance();\r\n return null;\r\n }\r\n }\r\n\r\n // Skip unrecognized tokens\r\n this.advance();\r\n return null;\r\n }\r\n\r\n /**\r\n * Parse for loop: for (init; condition; update) { body }\r\n */\r\n private parseForLoop(): ForLoopNode | null {\r\n this.expect('keyword', 'for');\r\n\r\n if (!this.check('punctuation', '(')) {\r\n this.errors.push({ line: 0, column: 0, message: 'Expected ( after for' });\r\n return null;\r\n }\r\n this.advance();\r\n\r\n // Parse init, condition, update (simplified - collect as strings)\r\n let init = '', condition = '', update = '';\r\n let depth = 0;\r\n\r\n // Parse init (until first ;)\r\n while (this.position < this.tokens.length) {\r\n const t = this.currentToken();\r\n if (!t) break;\r\n if (t.value === ';' && depth === 0) { this.advance(); break; }\r\n if (t.value === '(') depth++;\r\n if (t.value === ')') depth--;\r\n init += t.value + ' ';\r\n this.advance();\r\n }\r\n\r\n // Parse condition (until second ;)\r\n depth = 0;\r\n while (this.position < this.tokens.length) {\r\n const t = this.currentToken();\r\n if (!t) break;\r\n if (t.value === ';' && depth === 0) { this.advance(); break; }\r\n if (t.value === '(') depth++;\r\n if (t.value === ')') depth--;\r\n condition += t.value + ' ';\r\n this.advance();\r\n }\r\n\r\n // Parse update (until ))\r\n depth = 0;\r\n while (this.position < this.tokens.length) {\r\n const t = this.currentToken();\r\n if (!t) break;\r\n if (t.value === ')' && depth === 0) { this.advance(); break; }\r\n if (t.value === '(') depth++;\r\n if (t.value === ')') depth--;\r\n update += t.value + ' ';\r\n this.advance();\r\n }\r\n\r\n // Parse body\r\n const body: ASTNode[] = [];\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n let braceDepth = 1;\r\n while (braceDepth > 0 && this.position < this.tokens.length) {\r\n if (this.check('punctuation', '{')) braceDepth++;\r\n if (this.check('punctuation', '}')) braceDepth--;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'for-loop',\r\n init: init.trim(),\r\n condition: condition.trim(),\r\n update: update.trim(),\r\n body,\r\n position: { x: 0, y: 0, z: 0 },\r\n };\r\n }\r\n\r\n /**\r\n * Parse while loop: while (condition) { body }\r\n */\r\n private parseWhileLoop(): WhileLoopNode | null {\r\n this.expect('keyword', 'while');\r\n\r\n let condition = '';\r\n if (this.check('punctuation', '(')) {\r\n this.advance();\r\n let depth = 1;\r\n while (depth > 0 && this.position < this.tokens.length) {\r\n const t = this.currentToken();\r\n if (!t) break;\r\n if (t.value === '(') depth++;\r\n if (t.value === ')') { depth--; if (depth === 0) { this.advance(); break; } }\r\n condition += t.value + ' ';\r\n this.advance();\r\n }\r\n }\r\n\r\n // Parse body\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n let braceDepth = 1;\r\n while (braceDepth > 0 && this.position < this.tokens.length) {\r\n if (this.check('punctuation', '{')) braceDepth++;\r\n if (this.check('punctuation', '}')) braceDepth--;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'while-loop',\r\n condition: condition.trim(),\r\n body: [],\r\n position: { x: 0, y: 0, z: 0 },\r\n };\r\n }\r\n\r\n /**\r\n * Parse forEach loop: forEach item in collection { body }\r\n */\r\n private parseForEachLoop(): ForEachLoopNode | null {\r\n this.expect('keyword', 'forEach');\r\n\r\n const variable = this.expectIdentifier();\r\n this.expect('keyword', 'in');\r\n const collection = this.expectIdentifier();\r\n\r\n // Parse body\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n let braceDepth = 1;\r\n while (braceDepth > 0 && this.position < this.tokens.length) {\r\n if (this.check('punctuation', '{')) braceDepth++;\r\n if (this.check('punctuation', '}')) braceDepth--;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'foreach-loop',\r\n variable: variable || 'item',\r\n collection: collection || 'items',\r\n body: [],\r\n position: { x: 0, y: 0, z: 0 },\r\n };\r\n }\r\n\r\n /**\r\n * Parse import: import { x, y } from \"module\"\r\n */\r\n private parseImport(): ImportNode | null {\r\n this.expect('keyword', 'import');\r\n\r\n const imports: string[] = [];\r\n let modulePath = '';\r\n let defaultImport: string | undefined;\r\n\r\n // Check for default import or named imports\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n const name = this.expectIdentifier();\r\n if (name) imports.push(name);\r\n if (this.check('punctuation', ',')) this.advance();\r\n }\r\n this.expect('punctuation', '}');\r\n } else {\r\n // Default import\r\n defaultImport = this.expectIdentifier() || undefined;\r\n }\r\n\r\n // from \"module\"\r\n if (this.check('keyword', 'from')) {\r\n this.advance();\r\n const pathToken = this.currentToken();\r\n if (pathToken?.type === 'string') {\r\n modulePath = pathToken.value;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'import',\r\n imports,\r\n defaultImport,\r\n modulePath,\r\n position: { x: 0, y: 0, z: 0 },\r\n };\r\n }\r\n\r\n /**\r\n * Parse export: export { x, y } or export function/orb\r\n */\r\n private parseExport(): ExportNode | null {\r\n this.expect('keyword', 'export');\r\n\r\n // Check if exporting a declaration\r\n const next = this.currentToken();\r\n if (next?.type === 'keyword') {\r\n const declaration = this.parseDeclaration();\r\n return {\r\n type: 'export',\r\n declaration: declaration || undefined,\r\n position: { x: 0, y: 0, z: 0 },\r\n };\r\n }\r\n\r\n // Named exports\r\n const exports: string[] = [];\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n const name = this.expectIdentifier();\r\n if (name) exports.push(name);\r\n if (this.check('punctuation', ',')) this.advance();\r\n }\r\n this.expect('punctuation', '}');\r\n }\r\n\r\n return {\r\n type: 'export',\r\n exports,\r\n position: { x: 0, y: 0, z: 0 },\r\n };\r\n }\r\n\r\n /**\r\n * Parse variable declaration: const/let/var name = value\r\n */\r\n private parseVariableDeclaration(): VariableDeclarationNode | null {\r\n const kindToken = this.currentToken()?.value.toLowerCase();\r\n const kind: 'const' | 'let' | 'var' = kindToken === 'let' ? 'let' : kindToken === 'var' ? 'var' : 'const';\r\n this.advance();\r\n\r\n const name = this.expectIdentifier();\r\n if (!name) return null;\r\n\r\n let dataType: string | undefined;\r\n if (this.check('punctuation', ':')) {\r\n this.advance();\r\n dataType = this.expectIdentifier() || undefined;\r\n }\r\n\r\n let value: HoloScriptValue;\r\n if (this.check('punctuation', '=')) {\r\n this.advance();\r\n const valueToken = this.currentToken();\r\n if (valueToken?.type === 'string') {\r\n value = valueToken.value;\r\n this.advance();\r\n } else if (valueToken?.type === 'number') {\r\n value = parseFloat(valueToken.value);\r\n this.advance();\r\n } else if (valueToken?.type === 'identifier') {\r\n if (valueToken.value === 'true') value = true;\r\n else if (valueToken.value === 'false') value = false;\r\n else value = valueToken.value;\r\n this.advance();\r\n } else if (this.check('punctuation', '[')) {\r\n value = this.parseArray() as HoloScriptValue;\r\n } else if (this.check('punctuation', '{')) {\r\n value = this.parseObject() as HoloScriptValue;\r\n }\r\n }\r\n\r\n return {\r\n type: 'variable-declaration',\r\n kind,\r\n name,\r\n dataType,\r\n value,\r\n position: { x: 0, y: 0, z: 0 },\r\n };\r\n }\r\n\r\n /**\r\n * Parse orb declaration\r\n */\r\n private parseOrb(): OrbNode | null {\r\n const startToken = this.currentToken(); // Capture start token for line info\r\n \r\n // Support both 'orb' and 'object' keywords\r\n if (this.check('keyword', 'orb') || this.check('keyword', 'object')) {\r\n this.advance();\r\n } else {\r\n this.expect('keyword', 'orb'); // Fallback to standard error\r\n }\r\n\r\n let name = '';\r\n // Check for ID syntax: orb#id\r\n if (this.check('punctuation', '#')) {\r\n this.advance(); // #\r\n name = this.expectIdentifier() || `orb_${Date.now()}`;\r\n } else {\r\n name = this.expectIdentifier() || `orb_${Date.now()}`;\r\n }\r\n\r\n const properties: Record<string, HoloScriptValue> = {};\r\n const directives: HSPlusDirective[] = [];\r\n let position: SpatialPosition | undefined;\r\n let hologram: HologramProperties | undefined;\r\n\r\n if (this.check('punctuation', '{')) {\r\n this.advance(); // {\r\n\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n if (this.check('punctuation', '}')) break;\r\n\r\n const token = this.currentToken();\r\n if (token?.type === 'punctuation' && token.value === '@') {\r\n const directive = this.parseDirective();\r\n if (directive) directives.push(directive);\r\n } else {\r\n const prop = this.parseProperty();\r\n if (prop) {\r\n // Handle special properties\r\n if (prop.key === 'position' || prop.key === 'at') {\r\n position = this.parsePosition(prop.value);\r\n } else if (prop.key === 'color' || prop.key === 'glow' || prop.key === 'size') {\r\n hologram = hologram || { shape: 'orb', color: '#00ffff', size: 0.5, glow: true, interactive: true };\r\n if (prop.key === 'color') hologram.color = String(prop.value);\r\n if (prop.key === 'glow') hologram.glow = Boolean(prop.value);\r\n if (prop.key === 'size') hologram.size = Number(prop.value);\r\n } else {\r\n properties[prop.key] = prop.value;\r\n }\r\n }\r\n }\r\n\r\n this.skipNewlines();\r\n }\r\n\r\n this.expect('punctuation', '}');\r\n }\r\n\r\n return {\r\n type: 'orb',\r\n name,\r\n position: position || { x: 0, y: 0, z: 0 },\r\n hologram: hologram || { shape: 'orb', color: '#00ffff', size: 0.5, glow: true, interactive: true },\r\n properties,\r\n directives: directives,\r\n methods: [],\r\n line: startToken?.line || 0,\r\n };\r\n }\r\n\r\n /**\r\n * Parse HoloScript+ directive: @name(...) or @name { ... }\r\n */\r\n private parseDirective(): HSPlusDirective | null {\r\n this.expect('punctuation', '@');\r\n const name = this.expectIdentifier();\r\n if (!name) return null;\r\n\r\n // Handle @state { ... }\r\n if (name === 'state') {\r\n const body = this.parseObject() as Record<string, HoloScriptValue>;\r\n return { type: 'state', body };\r\n }\r\n\r\n // Handle @on_... hooks\r\n if (name.startsWith('on_')) {\r\n let body = '';\r\n if (this.check('punctuation', '{')) {\r\n this.advance(); // {\r\n let braceDepth = 1;\r\n while (braceDepth > 0 && this.position < this.tokens.length) {\r\n const t = this.advance()!;\r\n if (t.value === '{') braceDepth++;\r\n if (t.value === '}') braceDepth--;\r\n if (braceDepth > 0) body += t.value + ' ';\r\n else if (braceDepth < 0) break; // Should not happen with valid syntax\r\n }\r\n } else {\r\n const t = this.advance();\r\n if (t) body = t.value;\r\n }\r\n return { type: 'lifecycle', hook: name as any, body };\r\n }\r\n\r\n // Default: handle as trait\r\n let config: Record<string, HoloScriptValue> = {};\r\n if (this.check('punctuation', '(')) {\r\n this.advance(); // (\r\n while (!this.check('punctuation', ')') && this.position < this.tokens.length) {\r\n const prop = this.parseProperty();\r\n if (prop) {\r\n config[prop.key] = prop.value;\r\n }\r\n if (this.check('punctuation', ',')) {\r\n this.advance();\r\n }\r\n }\r\n this.expect('punctuation', ')');\r\n } else if (this.check('punctuation', '{')) {\r\n config = this.parseObject() as Record<string, HoloScriptValue>;\r\n }\r\n\r\n return { type: 'trait', name: name as any, config };\r\n }\r\n\r\n /**\r\n * Parse function declaration\r\n */\r\n private parseFunction(): MethodNode | null {\r\n this.expect('keyword', 'function');\r\n const name = this.expectIdentifier();\r\n if (!name) return null;\r\n\r\n const parameters: ParameterNode[] = [];\r\n let returnType: string | undefined;\r\n\r\n // Parse parameters\r\n if (this.check('punctuation', '(')) {\r\n this.advance(); // (\r\n\r\n while (!this.check('punctuation', ')') && this.position < this.tokens.length) {\r\n const paramName = this.expectIdentifier();\r\n if (!paramName) break;\r\n\r\n let paramType = 'any';\r\n if (this.check('punctuation', ':')) {\r\n this.advance(); // :\r\n paramType = this.expectIdentifier() || 'any';\r\n }\r\n\r\n parameters.push({\r\n type: 'parameter',\r\n name: paramName,\r\n dataType: paramType,\r\n });\r\n\r\n if (this.check('punctuation', ',')) {\r\n this.advance();\r\n }\r\n }\r\n\r\n this.expect('punctuation', ')');\r\n }\r\n\r\n // Parse return type\r\n if (this.check('punctuation', ':')) {\r\n this.advance();\r\n returnType = this.expectIdentifier() || undefined;\r\n }\r\n\r\n // Parse body\r\n const body: ASTNode[] = [];\r\n if (this.check('punctuation', '{')) {\r\n this.advance(); // {\r\n // Skip body parsing for now - just find closing brace\r\n let depth = 1;\r\n while (depth > 0 && this.position < this.tokens.length) {\r\n if (this.check('punctuation', '{')) depth++;\r\n if (this.check('punctuation', '}')) depth--;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'method',\r\n name,\r\n parameters,\r\n body,\r\n returnType,\r\n position: { x: 0, y: 0, z: 0 },\r\n hologram: { shape: 'cube', color: '#ff6b35', size: 1.5, glow: true, interactive: true },\r\n };\r\n }\r\n\r\n /**\r\n * Parse connection\r\n */\r\n private parseConnection(): ConnectionNode | null {\r\n this.expect('keyword', 'connect');\r\n const from = this.expectIdentifier();\r\n if (!from) return null;\r\n\r\n this.expect('keyword', 'to');\r\n const to = this.expectIdentifier();\r\n if (!to) return null;\r\n\r\n let dataType = 'any';\r\n if (this.check('keyword', 'as')) {\r\n this.advance();\r\n const typeStr = this.currentToken();\r\n if (typeStr?.type === 'string' || typeStr?.type === 'identifier') {\r\n dataType = typeStr.value;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'connection',\r\n from,\r\n to,\r\n dataType,\r\n bidirectional: false,\r\n };\r\n }\r\n\r\n /**\r\n * Parse scale block: scale <magnitude> { body }\r\n */\r\n private parseScale(): ScaleNode | null {\r\n this.expect('keyword', 'scale');\r\n const magnitude = (this.expectIdentifier() || 'standard') as ScaleNode['magnitude'];\r\n \r\n const multipliers: Record<string, number> = {\r\n 'galactic': 1000000,\r\n 'macro': 1000,\r\n 'standard': 1,\r\n 'micro': 0.001,\r\n 'atomic': 0.000001\r\n };\r\n\r\n const body: ASTNode[] = [];\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n const node = this.parseDeclaration();\r\n if (node) body.push(node);\r\n this.skipNewlines();\r\n }\r\n this.expect('punctuation', '}');\r\n }\r\n\r\n return {\r\n type: 'scale',\r\n magnitude,\r\n multiplier: multipliers[magnitude] || 1,\r\n body, \r\n position: { x: 0, y: 0, z: 0 }\r\n };\r\n }\r\n\r\n /**\r\n * Parse focus block: focus <target> { body }\r\n */\r\n private parseFocus(): FocusNode | null {\r\n this.expect('keyword', 'focus');\r\n const target = this.expectIdentifier() || 'origin';\r\n \r\n const body: ASTNode[] = [];\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n const node = this.parseDeclaration();\r\n if (node) body.push(node);\r\n this.skipNewlines();\r\n }\r\n this.expect('punctuation', '}');\r\n }\r\n\r\n return {\r\n type: 'focus',\r\n target,\r\n body,\r\n position: { x: 0, y: 0, z: 0 }\r\n };\r\n }\r\n\r\n /**\r\n * Parse environment declaration\r\n */\r\n private parseEnvironment(): EnvironmentNode | null {\r\n this.expect('keyword', 'environment');\r\n const settings: Record<string, HoloScriptValue> = {};\r\n \r\n // Parse settings until newline or }\r\n while (this.position < this.tokens.length && \r\n this.currentToken()?.type !== 'newline' && \r\n !this.check('punctuation', '}')) {\r\n const key = this.expectIdentifier();\r\n if (!key) break;\r\n settings[key] = this.parseLiteral() as HoloScriptValue;\r\n }\r\n\r\n return {\r\n type: 'environment',\r\n settings\r\n };\r\n }\r\n\r\n /**\r\n * Parse composition block\r\n */\r\n private parseComposition(): CompositionNode | null {\r\n this.expect('keyword', 'composition');\r\n const name = this.expectIdentifier() || 'unnamed';\r\n \r\n const children: ASTNode[] = [];\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n const node = this.parseDeclaration();\r\n if (node) children.push(node);\r\n this.skipNewlines();\r\n }\r\n this.expect('punctuation', '}');\r\n }\r\n\r\n return {\r\n type: 'composition',\r\n name,\r\n children\r\n };\r\n }\r\n\r\n /**\r\n * Parse template declaration\r\n */\r\n private parseTemplate(): TemplateNode | null {\r\n this.expect('keyword', 'template');\r\n const name = this.expectIdentifier() || 'template';\r\n \r\n const params: string[] = [];\r\n if (this.check('punctuation', '(')) {\r\n this.advance();\r\n while (!this.check('punctuation', ')') && this.position < this.tokens.length) {\r\n const p = this.expectIdentifier();\r\n if (p) params.push(p);\r\n if (this.check('punctuation', ',')) this.advance();\r\n }\r\n this.expect('punctuation', ')');\r\n }\r\n\r\n const body: ASTNode[] = [];\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n const node = this.parseDeclaration();\r\n if (node) body.push(node);\r\n this.skipNewlines();\r\n }\r\n this.expect('punctuation', '}');\r\n }\r\n\r\n return {\r\n type: 'template',\r\n name,\r\n parameters: params,\r\n body\r\n };\r\n }\r\n\r\n /**\r\n * Parse gate (conditional)\r\n */\r\n private parseGate(): GateNode | null {\r\n this.expect('keyword', 'gate');\r\n this.expectIdentifier(); // Gate name (consumed but not currently stored)\r\n\r\n let condition = '';\r\n if (this.check('punctuation', '(')) {\r\n this.advance();\r\n // Parse condition expression\r\n while (!this.check('punctuation', ')') && this.position < this.tokens.length) {\r\n const token = this.currentToken();\r\n if (token) condition += token.value + ' ';\r\n this.advance();\r\n }\r\n this.expect('punctuation', ')');\r\n }\r\n\r\n // Parse body if present\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n let depth = 1;\r\n while (depth > 0 && this.position < this.tokens.length) {\r\n if (this.check('punctuation', '{')) depth++;\r\n if (this.check('punctuation', '}')) depth--;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'gate',\r\n condition: condition.trim(),\r\n truePath: [],\r\n falsePath: [],\r\n position: { x: 0, y: 0, z: 0 },\r\n hologram: { shape: 'pyramid', color: '#4ecdc4', size: 1, glow: true, interactive: true },\r\n };\r\n }\r\n\r\n /**\r\n * Parse stream\r\n */\r\n private parseStream(): StreamNode | null {\r\n this.expect('keyword', 'stream');\r\n const name = this.expectIdentifier();\r\n if (!name) return null;\r\n\r\n let source = 'unknown';\r\n if (this.check('keyword', 'from')) {\r\n this.advance();\r\n source = this.expectIdentifier() || 'unknown';\r\n }\r\n\r\n // Parse body if present\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n let depth = 1;\r\n while (depth > 0 && this.position < this.tokens.length) {\r\n if (this.check('punctuation', '{')) depth++;\r\n if (this.check('punctuation', '}')) depth--;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'stream',\r\n name,\r\n source,\r\n transformations: [],\r\n position: { x: 0, y: 0, z: 0 },\r\n hologram: { shape: 'cylinder', color: '#45b7d1', size: 2, glow: true, interactive: true },\r\n };\r\n }\r\n\r\n /**\r\n * Parse nexus (multi-agent hub)\r\n */\r\n private parseNexus(): ASTNode | null {\r\n this.expect('keyword', 'nexus');\r\n const name = this.expectIdentifier();\r\n if (!name) return null;\r\n\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n let depth = 1;\r\n while (depth > 0 && this.position < this.tokens.length) {\r\n if (this.check('punctuation', '{')) depth++;\r\n if (this.check('punctuation', '}')) depth--;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'nexus',\r\n position: { x: 0, y: 0, z: 0 },\r\n hologram: { shape: 'sphere', color: '#9b59b6', size: 3, glow: true, interactive: true },\r\n };\r\n }\r\n\r\n /**\r\n * Parse building (class-like)\r\n */\r\n private parseBuilding(): ASTNode | null {\r\n this.expect('keyword', 'building');\r\n const name = this.expectIdentifier();\r\n if (!name) return null;\r\n\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n let depth = 1;\r\n while (depth > 0 && this.position < this.tokens.length) {\r\n if (this.check('punctuation', '{')) depth++;\r\n if (this.check('punctuation', '}')) depth--;\r\n this.advance();\r\n }\r\n }\r\n\r\n return {\r\n type: 'building',\r\n position: { x: 0, y: 0, z: 0 },\r\n hologram: { shape: 'cube', color: '#e74c3c', size: 4, glow: true, interactive: true },\r\n };\r\n }\r\n\r\n /**\r\n * Parse a literal value (string, number, boolean, array, or object)\r\n */\r\n private parseLiteral(): unknown {\r\n const token = this.currentToken();\r\n if (!token) return null;\r\n\r\n if (token.type === 'string') {\r\n this.advance();\r\n return token.value;\r\n }\r\n\r\n if (token.type === 'number') {\r\n this.advance();\r\n return parseFloat(token.value);\r\n }\r\n\r\n if (token.type === 'identifier') {\r\n const val = token.value.toLowerCase();\r\n this.advance();\r\n if (val === 'true') return true;\r\n if (val === 'false') return false;\r\n if (val === 'null') return null;\r\n return token.value;\r\n }\r\n\r\n if (this.check('punctuation', '[')) {\r\n return this.parseArray();\r\n }\r\n\r\n if (this.check('punctuation', '{')) {\r\n return this.parseObject();\r\n }\r\n\r\n this.advance();\r\n return token.value;\r\n }\r\n\r\n /**\r\n * Parse a property (key: value)\r\n */\r\n private parseProperty(): { key: string; value: HoloScriptValue } | null {\r\n const key = this.expectIdentifier();\r\n if (!key) return null;\r\n\r\n if (!this.check('punctuation', ':')) {\r\n return { key, value: true }; // Flag-style property\r\n }\r\n\r\n this.advance(); // :\r\n\r\n const value = this.parseLiteral() as HoloScriptValue;\r\n\r\n return { key, value };\r\n }\r\n\r\n /**\r\n * Parse array [...]\r\n */\r\n private parseArray(): any[] {\r\n const arr: any[] = [];\r\n this.expect('punctuation', '[');\r\n\r\n while (!this.check('punctuation', ']') && this.position < this.tokens.length) {\r\n const token = this.currentToken();\r\n if (token?.type === 'string' || token?.type === 'number' || token?.type === 'identifier') {\r\n if (token.type === 'number') {\r\n arr.push(parseFloat(token.value));\r\n } else {\r\n arr.push(token.value);\r\n }\r\n this.advance();\r\n }\r\n\r\n if (this.check('punctuation', ',')) {\r\n this.advance();\r\n }\r\n }\r\n\r\n this.expect('punctuation', ']');\r\n return arr;\r\n }\r\n\r\n /**\r\n * Parse object {...}\r\n */\r\n private parseObject(): Record<string, unknown> {\r\n const obj: Record<string, unknown> = {};\r\n this.expect('punctuation', '{');\r\n\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n if (this.check('punctuation', '}')) break;\r\n\r\n const prop = this.parseProperty();\r\n if (prop) {\r\n obj[prop.key] = prop.value;\r\n }\r\n\r\n this.skipNewlines();\r\n if (this.check('punctuation', ',')) {\r\n this.advance();\r\n }\r\n }\r\n\r\n this.expect('punctuation', '}');\r\n return obj;\r\n }\r\n\r\n /**\r\n * Parse position from value\r\n */\r\n private parsePosition(value: unknown): SpatialPosition {\r\n if (Array.isArray(value)) {\r\n return {\r\n x: Number(value[0]) || 0,\r\n y: Number(value[1]) || 0,\r\n z: Number(value[2]) || 0,\r\n };\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n const v = value as Record<string, unknown>;\r\n return {\r\n x: Number(v.x) || 0,\r\n y: Number(v.y) || 0,\r\n z: Number(v.z) || 0,\r\n };\r\n }\r\n return { x: 0, y: 0, z: 0 };\r\n }\r\n\r\n // Helper methods\r\n\r\n private currentToken(): Token | undefined {\r\n return this.tokens[this.position];\r\n }\r\n\r\n private advance(): Token | undefined {\r\n return this.tokens[this.position++];\r\n }\r\n\r\n private check(type: string, value?: string): boolean {\r\n const token = this.currentToken();\r\n if (!token) return false;\r\n if (token.type !== type) return false;\r\n if (value !== undefined && token.value.toLowerCase() !== value.toLowerCase()) return false;\r\n return true;\r\n }\r\n\r\n private expect(type: string, value?: string): boolean {\r\n if (this.check(type, value)) {\r\n this.advance();\r\n return true;\r\n }\r\n const token = this.currentToken();\r\n this.errors.push({\r\n line: token?.line || 0,\r\n column: token?.column || 0,\r\n message: `Expected ${type}${value ? ` '${value}'` : ''}, got ${token?.type || 'EOF'} '${token?.value || ''}'`,\r\n });\r\n return false;\r\n }\r\n\r\n private expectIdentifier(): string | null {\r\n const token = this.currentToken();\r\n if (token?.type === 'identifier' || token?.type === 'keyword') {\r\n this.advance();\r\n return token.value;\r\n }\r\n this.errors.push({\r\n line: token?.line || 0,\r\n column: token?.column || 0,\r\n message: `Expected identifier, got ${token?.type || 'EOF'}`,\r\n });\r\n return null;\r\n }\r\n\r\n /**\r\n * Parse animate command: animate target property: \"...\" from: 0 to: 1 duration: 1000\r\n */\r\n private parseAnimate(): ASTNode | null {\r\n this.expect('keyword', 'animate');\r\n const target = this.expectIdentifier();\r\n if (!target) return null;\r\n\r\n const properties: Record<string, HoloScriptValue> = {};\r\n\r\n // Parse inline properties\r\n while (this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n const t = this.currentToken();\r\n if (!t || t.type === 'newline' || (t.type === 'keyword' && this.keywordSet.has(t.value.toLowerCase()))) break;\r\n\r\n const prop = this.parseProperty();\r\n if (prop) {\r\n properties[prop.key] = prop.value;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n type: 'expression-statement',\r\n expression: `animate(\"${target}\", ${JSON.stringify(properties)})`,\r\n position: { x: 0, y: 0, z: 0 },\r\n } as ASTNode;\r\n }\r\n\r\n /**\r\n * Parse modify command: modify target { prop: value }\r\n */\r\n private parseModify(): ASTNode | null {\r\n this.expect('keyword', 'modify');\r\n const target = this.expectIdentifier();\r\n if (!target) return null;\r\n\r\n const properties: Record<string, HoloScriptValue> = {};\r\n\r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n if (this.check('punctuation', '}')) break;\r\n\r\n const prop = this.parseProperty();\r\n if (prop) {\r\n properties[prop.key] = prop.value;\r\n }\r\n this.skipNewlines();\r\n }\r\n this.expect('punctuation', '}');\r\n }\r\n\r\n return {\r\n type: 'expression-statement',\r\n expression: `modify(\"${target}\", ${JSON.stringify(properties)})`,\r\n position: { x: 0, y: 0, z: 0 },\r\n } as ASTNode;\r\n }\r\n\r\n /**\r\n * Parse UI Element: ui2d dashboard#id { ... }\r\n */\r\n private parseUIElement(): ASTNode | null {\r\n const typeToken = this.currentToken();\r\n if (!typeToken) return null;\r\n \r\n const elementType = typeToken.value;\r\n this.advance();\r\n \r\n let elementId = `${elementType}_${Date.now()}`;\r\n \r\n // Check for ID syntax\r\n const token = this.currentToken();\r\n if (token?.type === 'punctuation' && token.value === '#') {\r\n this.advance(); \r\n const idToken = this.currentToken();\r\n if (idToken) {\r\n elementId = idToken.value;\r\n this.advance();\r\n }\r\n } else if (token?.type === 'identifier' && token.value.startsWith('#')) {\r\n elementId = token.value.slice(1) || elementId;\r\n this.advance();\r\n }\r\n \r\n const properties: Record<string, HoloScriptValue> = {};\r\n \r\n if (this.check('punctuation', '{')) {\r\n this.advance();\r\n while (!this.check('punctuation', '}') && this.position < this.tokens.length) {\r\n this.skipNewlines();\r\n if (this.check('punctuation', '}')) break;\r\n \r\n const prop = this.parseProperty();\r\n if (prop) {\r\n properties[prop.key] = prop.value;\r\n }\r\n this.skipNewlines();\r\n }\r\n this.expect('punctuation', '}');\r\n }\r\n \r\n return {\r\n type: 'ui2d', \r\n name: elementType,\r\n properties: { id: elementId, ...properties },\r\n position: { x: 0, y: 0, z: 0 }\r\n } as ASTNode;\r\n }\r\n\r\n /**\r\n * Parse settings command: settings\r\n */\r\n private parseSettings(): ASTNode | null {\r\n this.expect('keyword', 'settings');\r\n return {\r\n type: 'expression-statement',\r\n expression: 'showSettings()',\r\n position: { x: 0, y: 0, z: 0 },\r\n } as ASTNode;\r\n }\r\n\r\n private parseChat(): ASTNode | null {\r\n this.expect('keyword', 'chat');\r\n return {\r\n type: 'expression-statement',\r\n expression: 'openChat()',\r\n position: { x: 0, y: 0, z: 0 },\r\n } as ASTNode;\r\n }\r\n\r\n private skipNewlines(): void {\r\n while (this.currentToken()?.type === 'newline') {\r\n this.advance();\r\n }\r\n }\r\n}\r\n"]}
|