bonescript-compiler 0.2.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/LICENSE +21 -0
- package/dist/algorithm_catalog.d.ts +32 -0
- package/dist/algorithm_catalog.js +323 -0
- package/dist/algorithm_catalog.js.map +1 -0
- package/dist/ast.d.ts +244 -0
- package/dist/ast.js +8 -0
- package/dist/ast.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +605 -0
- package/dist/cli.js.map +1 -0
- package/dist/emit_batch.d.ts +7 -0
- package/dist/emit_batch.js +133 -0
- package/dist/emit_batch.js.map +1 -0
- package/dist/emit_capability.d.ts +7 -0
- package/dist/emit_capability.js +376 -0
- package/dist/emit_capability.js.map +1 -0
- package/dist/emit_composition.d.ts +22 -0
- package/dist/emit_composition.js +184 -0
- package/dist/emit_composition.js.map +1 -0
- package/dist/emit_deploy.d.ts +9 -0
- package/dist/emit_deploy.js +191 -0
- package/dist/emit_deploy.js.map +1 -0
- package/dist/emit_events.d.ts +14 -0
- package/dist/emit_events.js +305 -0
- package/dist/emit_events.js.map +1 -0
- package/dist/emit_extras.d.ts +12 -0
- package/dist/emit_extras.js +234 -0
- package/dist/emit_extras.js.map +1 -0
- package/dist/emit_full.d.ts +13 -0
- package/dist/emit_full.js +273 -0
- package/dist/emit_full.js.map +1 -0
- package/dist/emit_maintenance.d.ts +16 -0
- package/dist/emit_maintenance.js +442 -0
- package/dist/emit_maintenance.js.map +1 -0
- package/dist/emit_runtime.d.ts +13 -0
- package/dist/emit_runtime.js +691 -0
- package/dist/emit_runtime.js.map +1 -0
- package/dist/emit_sourcemap.d.ts +29 -0
- package/dist/emit_sourcemap.js +123 -0
- package/dist/emit_sourcemap.js.map +1 -0
- package/dist/emit_tests.d.ts +15 -0
- package/dist/emit_tests.js +185 -0
- package/dist/emit_tests.js.map +1 -0
- package/dist/emit_websocket.d.ts +6 -0
- package/dist/emit_websocket.js +223 -0
- package/dist/emit_websocket.js.map +1 -0
- package/dist/emitter.d.ts +25 -0
- package/dist/emitter.js +511 -0
- package/dist/emitter.js.map +1 -0
- package/dist/extension_manager.d.ts +38 -0
- package/dist/extension_manager.js +170 -0
- package/dist/extension_manager.js.map +1 -0
- package/dist/formatter.d.ts +34 -0
- package/dist/formatter.js +317 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +113 -0
- package/dist/index.js.map +1 -0
- package/dist/ir.d.ts +168 -0
- package/dist/ir.js +10 -0
- package/dist/ir.js.map +1 -0
- package/dist/lexer.d.ts +195 -0
- package/dist/lexer.js +619 -0
- package/dist/lexer.js.map +1 -0
- package/dist/lowering.d.ts +25 -0
- package/dist/lowering.js +500 -0
- package/dist/lowering.js.map +1 -0
- package/dist/module_loader.d.ts +25 -0
- package/dist/module_loader.js +126 -0
- package/dist/module_loader.js.map +1 -0
- package/dist/optimizer.d.ts +26 -0
- package/dist/optimizer.js +158 -0
- package/dist/optimizer.js.map +1 -0
- package/dist/parse_decls.d.ts +13 -0
- package/dist/parse_decls.js +442 -0
- package/dist/parse_decls.js.map +1 -0
- package/dist/parse_decls2.d.ts +13 -0
- package/dist/parse_decls2.js +295 -0
- package/dist/parse_decls2.js.map +1 -0
- package/dist/parse_expr.d.ts +7 -0
- package/dist/parse_expr.js +197 -0
- package/dist/parse_expr.js.map +1 -0
- package/dist/parse_types.d.ts +6 -0
- package/dist/parse_types.js +51 -0
- package/dist/parse_types.js.map +1 -0
- package/dist/parser.d.ts +10 -0
- package/dist/parser.js +62 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser_base.d.ts +19 -0
- package/dist/parser_base.js +50 -0
- package/dist/parser_base.js.map +1 -0
- package/dist/parser_recovery.d.ts +26 -0
- package/dist/parser_recovery.js +140 -0
- package/dist/parser_recovery.js.map +1 -0
- package/dist/scaffold.d.ts +13 -0
- package/dist/scaffold.js +376 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/solver.d.ts +26 -0
- package/dist/solver.js +281 -0
- package/dist/solver.js.map +1 -0
- package/dist/typechecker.d.ts +52 -0
- package/dist/typechecker.js +534 -0
- package/dist/typechecker.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.js +85 -0
- package/dist/types.js.map +1 -0
- package/dist/verifier.d.ts +46 -0
- package/dist/verifier.js +307 -0
- package/dist/verifier.js.map +1 -0
- package/package.json +52 -0
- package/src/algorithm_catalog.ts +345 -0
- package/src/ast.ts +334 -0
- package/src/cli.ts +624 -0
- package/src/emit_batch.ts +140 -0
- package/src/emit_capability.ts +436 -0
- package/src/emit_composition.ts +196 -0
- package/src/emit_deploy.ts +190 -0
- package/src/emit_events.ts +307 -0
- package/src/emit_extras.ts +240 -0
- package/src/emit_full.ts +309 -0
- package/src/emit_maintenance.ts +459 -0
- package/src/emit_runtime.ts +731 -0
- package/src/emit_sourcemap.ts +140 -0
- package/src/emit_tests.ts +205 -0
- package/src/emit_websocket.ts +229 -0
- package/src/emitter.ts +566 -0
- package/src/extension_manager.ts +187 -0
- package/src/formatter.ts +297 -0
- package/src/index.ts +88 -0
- package/src/ir.ts +215 -0
- package/src/lexer.ts +630 -0
- package/src/lowering.ts +556 -0
- package/src/module_loader.ts +114 -0
- package/src/optimizer.ts +196 -0
- package/src/parse_decls.ts +409 -0
- package/src/parse_decls2.ts +244 -0
- package/src/parse_expr.ts +197 -0
- package/src/parse_types.ts +54 -0
- package/src/parser.ts +64 -0
- package/src/parser_base.ts +57 -0
- package/src/parser_recovery.ts +153 -0
- package/src/scaffold.ts +375 -0
- package/src/solver.ts +330 -0
- package/src/typechecker.ts +591 -0
- package/src/types.ts +122 -0
- package/src/verifier.ts +348 -0
package/dist/parser.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Parser = exports.ParseError = void 0;
|
|
4
|
+
const lexer_1 = require("./lexer");
|
|
5
|
+
const parser_base_1 = require("./parser_base");
|
|
6
|
+
const parse_decls_1 = require("./parse_decls");
|
|
7
|
+
const parse_decls2_1 = require("./parse_decls2");
|
|
8
|
+
var parser_base_2 = require("./parser_base");
|
|
9
|
+
Object.defineProperty(exports, "ParseError", { enumerable: true, get: function () { return parser_base_2.ParseError; } });
|
|
10
|
+
class Parser {
|
|
11
|
+
constructor(tokens) {
|
|
12
|
+
this.s = new parser_base_1.TokenStream(tokens);
|
|
13
|
+
}
|
|
14
|
+
parse() {
|
|
15
|
+
const loc = this.s.peek().loc;
|
|
16
|
+
const systems = [];
|
|
17
|
+
while (!this.s.check(lexer_1.TokenKind.EOF)) {
|
|
18
|
+
systems.push(this.parseSystemDecl());
|
|
19
|
+
}
|
|
20
|
+
if (systems.length === 0) {
|
|
21
|
+
throw new parser_base_1.ParseError("Program must contain at least one system declaration", loc);
|
|
22
|
+
}
|
|
23
|
+
return { kind: "Program", loc, systems };
|
|
24
|
+
}
|
|
25
|
+
parseSystemDecl() {
|
|
26
|
+
const loc = this.s.peek().loc;
|
|
27
|
+
this.s.expect(lexer_1.TokenKind.KwSystem, "system declaration");
|
|
28
|
+
const name = this.s.expect(lexer_1.TokenKind.Identifier, "system name").value;
|
|
29
|
+
this.s.expect(lexer_1.TokenKind.LBrace, "system body");
|
|
30
|
+
let domain = null;
|
|
31
|
+
if (this.s.check(lexer_1.TokenKind.KwDomain)) {
|
|
32
|
+
this.s.advance();
|
|
33
|
+
this.s.expect(lexer_1.TokenKind.Colon, "domain");
|
|
34
|
+
domain = this.s.expect(lexer_1.TokenKind.Identifier, "domain name").value;
|
|
35
|
+
}
|
|
36
|
+
const declarations = [];
|
|
37
|
+
while (!this.s.check(lexer_1.TokenKind.RBrace) && !this.s.check(lexer_1.TokenKind.EOF)) {
|
|
38
|
+
declarations.push(this.parseDeclaration());
|
|
39
|
+
}
|
|
40
|
+
this.s.expect(lexer_1.TokenKind.RBrace, "system body close");
|
|
41
|
+
return { kind: "SystemDecl", loc, name, domain, declarations };
|
|
42
|
+
}
|
|
43
|
+
parseDeclaration() {
|
|
44
|
+
const tok = this.s.peek();
|
|
45
|
+
switch (tok.kind) {
|
|
46
|
+
case lexer_1.TokenKind.KwEntity: return (0, parse_decls_1.parseEntityDecl)(this.s);
|
|
47
|
+
case lexer_1.TokenKind.KwCapability: return (0, parse_decls_1.parseCapabilityDecl)(this.s);
|
|
48
|
+
case lexer_1.TokenKind.KwChannel: return (0, parse_decls2_1.parseChannelDecl)(this.s);
|
|
49
|
+
case lexer_1.TokenKind.KwStore: return (0, parse_decls2_1.parseStoreDecl)(this.s);
|
|
50
|
+
case lexer_1.TokenKind.KwEvent: return (0, parse_decls2_1.parseEventDecl)(this.s);
|
|
51
|
+
case lexer_1.TokenKind.KwConstraint: return (0, parse_decls2_1.parseConstraintDecl)(this.s);
|
|
52
|
+
case lexer_1.TokenKind.KwPolicy: return (0, parse_decls2_1.parsePolicyDecl)(this.s);
|
|
53
|
+
case lexer_1.TokenKind.KwFlow: return (0, parse_decls2_1.parseFlowDecl)(this.s);
|
|
54
|
+
case lexer_1.TokenKind.KwImport: return (0, parse_decls2_1.parseImportDecl)(this.s);
|
|
55
|
+
case lexer_1.TokenKind.KwExtensionPoint: return (0, parse_decls2_1.parseExtensionPointDecl)(this.s);
|
|
56
|
+
default:
|
|
57
|
+
throw new parser_base_1.ParseError("Expected declaration, got " + tok.kind, tok.loc);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.Parser = Parser;
|
|
62
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bone parser Base — Token stream utilities.
|
|
3
|
+
*/
|
|
4
|
+
import { Token, TokenKind, SourceLocation } from "./lexer";
|
|
5
|
+
export declare class ParseError extends Error {
|
|
6
|
+
loc: SourceLocation;
|
|
7
|
+
constructor(message: string, loc: SourceLocation);
|
|
8
|
+
}
|
|
9
|
+
export declare class TokenStream {
|
|
10
|
+
private tokens;
|
|
11
|
+
private pos;
|
|
12
|
+
constructor(tokens: Token[]);
|
|
13
|
+
peek(offset?: number): Token;
|
|
14
|
+
check(kind: TokenKind): boolean;
|
|
15
|
+
checkAny(...kinds: TokenKind[]): boolean;
|
|
16
|
+
advance(): Token;
|
|
17
|
+
expect(kind: TokenKind, context: string): Token;
|
|
18
|
+
match(kind: TokenKind): boolean;
|
|
19
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* bone parser Base — Token stream utilities.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TokenStream = exports.ParseError = void 0;
|
|
7
|
+
class ParseError extends Error {
|
|
8
|
+
constructor(message, loc) {
|
|
9
|
+
super(`Parse error at ${loc.line}:${loc.column}: ${message}`);
|
|
10
|
+
this.loc = loc;
|
|
11
|
+
this.name = "ParseError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ParseError = ParseError;
|
|
15
|
+
class TokenStream {
|
|
16
|
+
constructor(tokens) {
|
|
17
|
+
this.pos = 0;
|
|
18
|
+
this.tokens = tokens;
|
|
19
|
+
}
|
|
20
|
+
peek(offset = 0) {
|
|
21
|
+
return this.tokens[this.pos + offset] ?? this.tokens[this.tokens.length - 1];
|
|
22
|
+
}
|
|
23
|
+
check(kind) {
|
|
24
|
+
return this.peek().kind === kind;
|
|
25
|
+
}
|
|
26
|
+
checkAny(...kinds) {
|
|
27
|
+
return kinds.includes(this.peek().kind);
|
|
28
|
+
}
|
|
29
|
+
advance() {
|
|
30
|
+
const t = this.tokens[this.pos];
|
|
31
|
+
if (this.pos < this.tokens.length - 1)
|
|
32
|
+
this.pos++;
|
|
33
|
+
return t;
|
|
34
|
+
}
|
|
35
|
+
expect(kind, context) {
|
|
36
|
+
if (!this.check(kind)) {
|
|
37
|
+
throw new ParseError(`Expected ${kind} in ${context}, got ${this.peek().kind} ('${this.peek().value}')`, this.peek().loc);
|
|
38
|
+
}
|
|
39
|
+
return this.advance();
|
|
40
|
+
}
|
|
41
|
+
match(kind) {
|
|
42
|
+
if (this.check(kind)) {
|
|
43
|
+
this.advance();
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.TokenStream = TokenStream;
|
|
50
|
+
//# sourceMappingURL=parser_base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser_base.js","sourceRoot":"","sources":["../src/parser_base.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAIH,MAAa,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe,EAAS,GAAmB;QACrD,KAAK,CAAC,kBAAkB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;QAD5B,QAAG,GAAH,GAAG,CAAgB;QAErD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AALD,gCAKC;AAED,MAAa,WAAW;IAItB,YAAY,MAAe;QAFnB,QAAG,GAAW,CAAC,CAAC;QAGtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,SAAiB,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,IAAe;QACnB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;IACnC,CAAC;IAED,QAAQ,CAAC,GAAG,KAAkB;QAC5B,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO;QACL,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,IAAe,EAAE,OAAe;QACrC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAClB,YAAY,IAAI,OAAO,OAAO,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAClF,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAChB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAe;QACnB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA3CD,kCA2CC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bone parser with Error Recovery
|
|
3
|
+
* Wraps the strict parser to collect multiple errors per file.
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* - On error, skip tokens until we hit a synchronization point
|
|
7
|
+
* - Synchronization points: declaration keywords (entity, capability, etc.) and closing braces
|
|
8
|
+
* - Each error is recorded with location, but parsing continues
|
|
9
|
+
*/
|
|
10
|
+
import { Token } from "./lexer";
|
|
11
|
+
import { ParseError } from "./parser_base";
|
|
12
|
+
import * as AST from "./ast";
|
|
13
|
+
export interface RecoveredParseResult {
|
|
14
|
+
ast: AST.ProgramNode | null;
|
|
15
|
+
errors: ParseError[];
|
|
16
|
+
}
|
|
17
|
+
export declare class RecoveringParser {
|
|
18
|
+
private s;
|
|
19
|
+
private errors;
|
|
20
|
+
constructor(tokens: Token[]);
|
|
21
|
+
parse(): RecoveredParseResult;
|
|
22
|
+
private synchronize;
|
|
23
|
+
private parseSystemDecl;
|
|
24
|
+
private synchronizeInBody;
|
|
25
|
+
private parseDeclaration;
|
|
26
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* bone parser with Error Recovery
|
|
4
|
+
* Wraps the strict parser to collect multiple errors per file.
|
|
5
|
+
*
|
|
6
|
+
* Strategy:
|
|
7
|
+
* - On error, skip tokens until we hit a synchronization point
|
|
8
|
+
* - Synchronization points: declaration keywords (entity, capability, etc.) and closing braces
|
|
9
|
+
* - Each error is recorded with location, but parsing continues
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RecoveringParser = void 0;
|
|
13
|
+
const lexer_1 = require("./lexer");
|
|
14
|
+
const parser_base_1 = require("./parser_base");
|
|
15
|
+
const parse_decls_1 = require("./parse_decls");
|
|
16
|
+
const parse_decls2_1 = require("./parse_decls2");
|
|
17
|
+
const SYNC_POINTS = new Set([
|
|
18
|
+
lexer_1.TokenKind.KwSystem,
|
|
19
|
+
lexer_1.TokenKind.KwEntity,
|
|
20
|
+
lexer_1.TokenKind.KwCapability,
|
|
21
|
+
lexer_1.TokenKind.KwChannel,
|
|
22
|
+
lexer_1.TokenKind.KwStore,
|
|
23
|
+
lexer_1.TokenKind.KwEvent,
|
|
24
|
+
lexer_1.TokenKind.KwConstraint,
|
|
25
|
+
lexer_1.TokenKind.KwPolicy,
|
|
26
|
+
lexer_1.TokenKind.KwFlow,
|
|
27
|
+
lexer_1.TokenKind.KwImport,
|
|
28
|
+
lexer_1.TokenKind.KwExtensionPoint,
|
|
29
|
+
lexer_1.TokenKind.RBrace,
|
|
30
|
+
]);
|
|
31
|
+
class RecoveringParser {
|
|
32
|
+
constructor(tokens) {
|
|
33
|
+
this.errors = [];
|
|
34
|
+
this.s = new parser_base_1.TokenStream(tokens);
|
|
35
|
+
}
|
|
36
|
+
parse() {
|
|
37
|
+
const loc = this.s.peek().loc;
|
|
38
|
+
const systems = [];
|
|
39
|
+
while (!this.s.check(lexer_1.TokenKind.EOF)) {
|
|
40
|
+
try {
|
|
41
|
+
systems.push(this.parseSystemDecl());
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
if (e instanceof parser_base_1.ParseError) {
|
|
45
|
+
this.errors.push(e);
|
|
46
|
+
this.synchronize();
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw e;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (systems.length === 0 && this.errors.length === 0) {
|
|
54
|
+
this.errors.push(new parser_base_1.ParseError("Program must contain at least one system declaration", loc));
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
ast: systems.length > 0 ? { kind: "Program", loc, systems } : null,
|
|
58
|
+
errors: this.errors,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
synchronize() {
|
|
62
|
+
// Skip tokens until we find a synchronization point
|
|
63
|
+
while (!this.s.check(lexer_1.TokenKind.EOF)) {
|
|
64
|
+
const tok = this.s.peek();
|
|
65
|
+
if (SYNC_POINTS.has(tok.kind)) {
|
|
66
|
+
// Found sync point — if it's a closing brace, consume it; otherwise leave it for next parse
|
|
67
|
+
if (tok.kind === lexer_1.TokenKind.RBrace)
|
|
68
|
+
this.s.advance();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this.s.advance();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
parseSystemDecl() {
|
|
75
|
+
const loc = this.s.peek().loc;
|
|
76
|
+
this.s.expect(lexer_1.TokenKind.KwSystem, "system declaration");
|
|
77
|
+
const name = this.s.expect(lexer_1.TokenKind.Identifier, "system name").value;
|
|
78
|
+
this.s.expect(lexer_1.TokenKind.LBrace, "system body");
|
|
79
|
+
let domain = null;
|
|
80
|
+
if (this.s.check(lexer_1.TokenKind.KwDomain)) {
|
|
81
|
+
this.s.advance();
|
|
82
|
+
this.s.expect(lexer_1.TokenKind.Colon, "domain");
|
|
83
|
+
domain = this.s.expect(lexer_1.TokenKind.Identifier, "domain name").value;
|
|
84
|
+
}
|
|
85
|
+
const declarations = [];
|
|
86
|
+
while (!this.s.check(lexer_1.TokenKind.RBrace) && !this.s.check(lexer_1.TokenKind.EOF)) {
|
|
87
|
+
try {
|
|
88
|
+
declarations.push(this.parseDeclaration());
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
if (e instanceof parser_base_1.ParseError) {
|
|
92
|
+
this.errors.push(e);
|
|
93
|
+
this.synchronizeInBody();
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
throw e;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
this.s.expect(lexer_1.TokenKind.RBrace, "system body close");
|
|
101
|
+
return { kind: "SystemDecl", loc, name, domain, declarations };
|
|
102
|
+
}
|
|
103
|
+
synchronizeInBody() {
|
|
104
|
+
let depth = 0;
|
|
105
|
+
while (!this.s.check(lexer_1.TokenKind.EOF)) {
|
|
106
|
+
const tok = this.s.peek();
|
|
107
|
+
if (tok.kind === lexer_1.TokenKind.LBrace)
|
|
108
|
+
depth++;
|
|
109
|
+
if (tok.kind === lexer_1.TokenKind.RBrace) {
|
|
110
|
+
if (depth === 0)
|
|
111
|
+
return; // hit system close
|
|
112
|
+
depth--;
|
|
113
|
+
this.s.advance();
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (depth === 0 && SYNC_POINTS.has(tok.kind))
|
|
117
|
+
return;
|
|
118
|
+
this.s.advance();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
parseDeclaration() {
|
|
122
|
+
const tok = this.s.peek();
|
|
123
|
+
switch (tok.kind) {
|
|
124
|
+
case lexer_1.TokenKind.KwEntity: return (0, parse_decls_1.parseEntityDecl)(this.s);
|
|
125
|
+
case lexer_1.TokenKind.KwCapability: return (0, parse_decls_1.parseCapabilityDecl)(this.s);
|
|
126
|
+
case lexer_1.TokenKind.KwChannel: return (0, parse_decls2_1.parseChannelDecl)(this.s);
|
|
127
|
+
case lexer_1.TokenKind.KwStore: return (0, parse_decls2_1.parseStoreDecl)(this.s);
|
|
128
|
+
case lexer_1.TokenKind.KwEvent: return (0, parse_decls2_1.parseEventDecl)(this.s);
|
|
129
|
+
case lexer_1.TokenKind.KwConstraint: return (0, parse_decls2_1.parseConstraintDecl)(this.s);
|
|
130
|
+
case lexer_1.TokenKind.KwPolicy: return (0, parse_decls2_1.parsePolicyDecl)(this.s);
|
|
131
|
+
case lexer_1.TokenKind.KwFlow: return (0, parse_decls2_1.parseFlowDecl)(this.s);
|
|
132
|
+
case lexer_1.TokenKind.KwImport: return (0, parse_decls2_1.parseImportDecl)(this.s);
|
|
133
|
+
case lexer_1.TokenKind.KwExtensionPoint: return (0, parse_decls2_1.parseExtensionPointDecl)(this.s);
|
|
134
|
+
default:
|
|
135
|
+
throw new parser_base_1.ParseError(`Expected declaration, got ${tok.kind} ('${tok.value}')`, tok.loc);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.RecoveringParser = RecoveringParser;
|
|
140
|
+
//# sourceMappingURL=parser_recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser_recovery.js","sourceRoot":"","sources":["../src/parser_recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoneScript Project Scaffolder — `bone init`
|
|
3
|
+
* Creates a new BoneScript project with sensible defaults for a chosen domain.
|
|
4
|
+
*/
|
|
5
|
+
export type ScaffoldDomain = "multiplayer_game" | "saas_platform" | "iot_system" | "social_network" | "marketplace" | "realtime_collaboration";
|
|
6
|
+
export interface ScaffoldOptions {
|
|
7
|
+
name: string;
|
|
8
|
+
domain: ScaffoldDomain;
|
|
9
|
+
outDir: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function scaffold(opts: ScaffoldOptions): {
|
|
12
|
+
created: string[];
|
|
13
|
+
};
|