@ldclabs/kip-lang 0.3.0 → 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.
- package/README.md +69 -5
- package/dist/ast.d.ts +10 -1
- package/dist/ast.d.ts.map +1 -1
- package/dist/budget.d.ts +37 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +105 -0
- package/dist/budget.js.map +1 -0
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +7 -1
- package/dist/diagnostics.js.map +1 -1
- package/dist/errors.d.ts +29 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +27 -0
- package/dist/errors.js.map +1 -0
- package/dist/exec-ast.d.ts +314 -0
- package/dist/exec-ast.d.ts.map +1 -0
- package/dist/exec-ast.js +23 -0
- package/dist/exec-ast.js.map +1 -0
- package/dist/formatter.d.ts +5 -7
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +71 -143
- package/dist/formatter.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lexer.d.ts.map +1 -1
- package/dist/lexer.js +42 -11
- package/dist/lexer.js.map +1 -1
- package/dist/lower.d.ts +18 -0
- package/dist/lower.d.ts.map +1 -0
- package/dist/lower.js +877 -0
- package/dist/lower.js.map +1 -0
- package/dist/parser.js +311 -82
- package/dist/parser.js.map +1 -1
- package/dist/semantics.d.ts +13 -0
- package/dist/semantics.d.ts.map +1 -0
- package/dist/semantics.js +228 -0
- package/dist/semantics.js.map +1 -0
- package/dist/token.d.ts +4 -4
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +5 -10
- package/dist/token.js.map +1 -1
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +13 -0
- package/dist/version.js.map +1 -0
- package/package.json +9 -4
package/README.md
CHANGED
|
@@ -2,15 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
TypeScript toolkit for **KIP** (Knowledge Interaction Protocol) — a structured query language for knowledge graphs.
|
|
4
4
|
|
|
5
|
-
Provides a full-featured **lexer → parser → AST → formatter / diagnostics**
|
|
5
|
+
Provides a full-featured **lexer → parser → AST → formatter / diagnostics**
|
|
6
|
+
pipeline for `.kip` files, plus **`lower`**, which turns a syntax tree into the
|
|
7
|
+
executable AST a KIP engine runs.
|
|
6
8
|
|
|
7
|
-
The parser targets the KIP v1.0-
|
|
9
|
+
The parser targets the KIP v1.0-RC10 command-text syntax, including `:parameter`
|
|
8
10
|
placeholders in full value positions, JSON-compatible object literals with
|
|
9
11
|
unquoted identifier keys, predicate variables, multi-key `ORDER BY`, `SEARCH`
|
|
10
12
|
retrieval modes and thresholds, `EXPECT VERSION`, `UPDATE`, `MERGE`, `EXPORT`,
|
|
11
|
-
and batch-friendly multi-command source text. The
|
|
12
|
-
(`command`, `commands`, `parameters`, `dry_run`)
|
|
13
|
-
language and should be validated by the caller.
|
|
13
|
+
`EXPORT ... CURSOR`, and batch-friendly multi-command source text. The
|
|
14
|
+
`execute_kip` request envelope (`command`, `commands`, `parameters`, `dry_run`)
|
|
15
|
+
is JSON outside the `.kip` language and should be validated by the caller.
|
|
16
|
+
|
|
17
|
+
## Two trees, two audiences
|
|
18
|
+
|
|
19
|
+
`parse` returns a **syntax tree**: ranges, comments, quoting style, raw number
|
|
20
|
+
text — everything a formatter or an editor needs to reproduce the source, and
|
|
21
|
+
error recovery that keeps producing a tree after a mistake.
|
|
22
|
+
|
|
23
|
+
`lower` returns the **executable AST**: every construct collapsed to the one
|
|
24
|
+
shape it means, with the open-ended parts of the grammar closed. A concept
|
|
25
|
+
matcher becomes one of four identified forms; a filter becomes a comparison, a
|
|
26
|
+
logical node, a negation, or a call to one of seven functions; a variable
|
|
27
|
+
becomes a name and a dot path. Anything the syntax admits but the language does
|
|
28
|
+
not — an unknown filter function, `{type: "T"}` where an identity is required,
|
|
29
|
+
an `UPDATE` expression reading a foreign variable — is rejected here, with a
|
|
30
|
+
KIP error code.
|
|
31
|
+
|
|
32
|
+
That split is why the two exist: an editor wants the loosest tree it can get,
|
|
33
|
+
an engine wants the tightest.
|
|
14
34
|
|
|
15
35
|
## Installation
|
|
16
36
|
|
|
@@ -90,6 +110,38 @@ Diagnostics cover:
|
|
|
90
110
|
- Bracket matching (unclosed / mismatched braces, brackets, parentheses)
|
|
91
111
|
- Parser errors (unexpected tokens, missing clauses)
|
|
92
112
|
|
|
113
|
+
### Lower to the executable AST
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
import { parse, lower, checkBudget } from '@ldclabs/kip-lang'
|
|
117
|
+
|
|
118
|
+
function command(source: string) {
|
|
119
|
+
checkBudget(source) // KIP_4002 before parsing recurses
|
|
120
|
+
const { ast, diagnostics } = parse(source)
|
|
121
|
+
const fatal = diagnostics.find((d) => d.severity === 'error')
|
|
122
|
+
if (fatal) throw new Error(`${fatal.code} ${fatal.message}`)
|
|
123
|
+
return lower(ast) // throws KipSyntaxError
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
command('FIND(?d.name) WHERE { ?d {type: "Drug"} } LIMIT 10')
|
|
127
|
+
// { Kql: { find_clause: { expressions: [{ Variable: { var: "d", path: ["name"] } }] }, ... } }
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`lower` requires the program to hold exactly one command; consecutive `UPSERT`
|
|
131
|
+
blocks count as one, since that is how a schema capsule is written. Use
|
|
132
|
+
`lowerAll` for source text that is genuinely a sequence of commands.
|
|
133
|
+
|
|
134
|
+
The `diagnostics` check above is not decoration. `parse` recovers from a
|
|
135
|
+
malformed string or an unquoted value by reading it leniently, and `lower`
|
|
136
|
+
receives only the tree — so skipping the check lowers `"a\xb"` to `axb` and
|
|
137
|
+
`{a: bare}` to `{a: "bare"}` without a word of complaint.
|
|
138
|
+
|
|
139
|
+
`checkBudget` is not optional for a server. `parse` is recursive descent, so
|
|
140
|
+
without a depth ceiling a hostile `[[[[…` overflows the JavaScript stack — and
|
|
141
|
+
in a runtime that shares one stack across requests, that takes down more than
|
|
142
|
+
the one request. The budgets match `anda_kip`'s, so a command one KIP engine
|
|
143
|
+
refuses on size is refused by every other engine too.
|
|
144
|
+
|
|
93
145
|
## API Reference
|
|
94
146
|
|
|
95
147
|
| Export | Description |
|
|
@@ -99,6 +151,13 @@ Diagnostics cover:
|
|
|
99
151
|
| `format(source, options?)` | AST-based formatting with comment preservation |
|
|
100
152
|
| `formatPreservingComments(source, options?)` | Line-level indent normalization |
|
|
101
153
|
| `diagnose(source)` | Return `Diagnostic[]` (lexer + bracket + parser errors) |
|
|
154
|
+
| `analyzeSemantics(program)` | Spec SHOULD/MUST checks decidable without a live schema |
|
|
155
|
+
| `lower(program)` | Lower one command to the executable `Command` AST |
|
|
156
|
+
| `lowerAll(program)` | Lower every command in a multi-statement program |
|
|
157
|
+
| `lowerStatement(statement)` | Lower a single statement |
|
|
158
|
+
| `checkBudget(source)` | Enforce length and nesting ceilings (`KIP_4002`) |
|
|
159
|
+
| `checkBatchBudget(count)` | Enforce the command-count ceiling (`KIP_4002`) |
|
|
160
|
+
| `KipSyntaxError` | Thrown by `lower` / `checkBudget`, carries a KIP code |
|
|
102
161
|
| `TokenType` | Enum of all token types |
|
|
103
162
|
| `KEYWORDS` / `FUNCTIONS` | Maps of KIP keywords and built-in functions |
|
|
104
163
|
|
|
@@ -111,6 +170,11 @@ All AST types are exported for downstream consumption:
|
|
|
111
170
|
- **Patterns**: `ConceptPattern`, `PropositionPattern`, `FilterClause`, `NotClause`, `OptionalClause`, `UnionClause`
|
|
112
171
|
- **Expressions**: `ObjectLiteral`, `ArrayLiteral`, `ObjectEntry`, `Expression`
|
|
113
172
|
|
|
173
|
+
The executable AST is exported separately: `Command`, `KqlQuery`,
|
|
174
|
+
`KmlStatement`, `MetaCommand`, `ExecConceptMatcher`, `PropositionMatcher`,
|
|
175
|
+
`TargetTerm`, `PredTerm`, `FilterExpression`, `UpdateValue`, `KipValue`, and
|
|
176
|
+
friends. Names that collide with a syntax-tree node carry an `Exec` prefix.
|
|
177
|
+
|
|
114
178
|
String-or-parameter statement fields such as `SearchStatement.termValue`,
|
|
115
179
|
`SearchStatement.withTypeValue`, `SearchStatement.modeValue`, and
|
|
116
180
|
`DescribeStatement.typeNameValue` preserve whether the original source used a
|
package/dist/ast.d.ts
CHANGED
|
@@ -106,7 +106,8 @@ export interface UpsertStatement extends BaseNode {
|
|
|
106
106
|
export type UpsertBlock = ConceptBlock | PropositionBlock;
|
|
107
107
|
export interface ConceptBlock extends BaseNode {
|
|
108
108
|
kind: 'ConceptBlock';
|
|
109
|
-
|
|
109
|
+
/** `?local_handle`, absent when the block is not referenced elsewhere. */
|
|
110
|
+
handle?: string;
|
|
110
111
|
matcher: ConceptMatcher;
|
|
111
112
|
expectVersion?: ExpectVersion;
|
|
112
113
|
setAttributes?: SetAttributes;
|
|
@@ -210,6 +211,7 @@ export interface ExportStatement extends BaseNode {
|
|
|
210
211
|
target: string;
|
|
211
212
|
where: WhereClause;
|
|
212
213
|
limit?: LimitClause;
|
|
214
|
+
cursor?: CursorClause;
|
|
213
215
|
}
|
|
214
216
|
export type Expression = BinaryExpression | UnaryExpression | FunctionCallExpr | DotExpression | VariableRef | ParameterRef | StringLiteral | NumberLiteral | BooleanLiteral | NullLiteral | ArrayLiteral | ObjectLiteral;
|
|
215
217
|
export interface BinaryExpression extends BaseNode {
|
|
@@ -261,10 +263,17 @@ export interface NullLiteral extends BaseNode {
|
|
|
261
263
|
export interface ArrayLiteral extends BaseNode {
|
|
262
264
|
kind: 'ArrayLiteral';
|
|
263
265
|
elements: Expression[];
|
|
266
|
+
/**
|
|
267
|
+
* Whether a comma preceded the closing bracket. JSON-value position tolerates
|
|
268
|
+
* it; a FILTER list does not, and only the source says which was written.
|
|
269
|
+
*/
|
|
270
|
+
trailingComma?: boolean;
|
|
264
271
|
}
|
|
265
272
|
export interface ObjectLiteral extends BaseNode {
|
|
266
273
|
kind: 'ObjectLiteral';
|
|
267
274
|
entries: ObjectEntry[];
|
|
275
|
+
/** See {@link ArrayLiteral.trailingComma}. */
|
|
276
|
+
trailingComma?: boolean;
|
|
268
277
|
}
|
|
269
278
|
export interface ObjectEntry extends BaseNode {
|
|
270
279
|
kind: 'ObjectEntry';
|
package/dist/ast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
|
package/dist/budget.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser budgets.
|
|
3
|
+
*
|
|
4
|
+
* KIP source reaches a server as agent-generated text, so the parser is an
|
|
5
|
+
* attack surface before it is a convenience. `parse` is recursive descent:
|
|
6
|
+
* without a depth ceiling, `[[[[...` recurses until the JavaScript stack
|
|
7
|
+
* overflows, and in an environment that shares one stack across requests
|
|
8
|
+
* (a Cloudflare Worker isolate, say) that takes the whole runtime down rather
|
|
9
|
+
* than failing the one request. The check runs on raw text, before a single
|
|
10
|
+
* token is produced, so a hostile input costs one linear scan.
|
|
11
|
+
*
|
|
12
|
+
* The values mirror `MAX_KIP_*` in `anda_kip`'s parser: a command rejected by
|
|
13
|
+
* one KIP engine's budget must be rejected by every other engine's, or the
|
|
14
|
+
* same command succeeds on one deployment and fails on another.
|
|
15
|
+
*/
|
|
16
|
+
export declare const MAX_KIP_INPUT_LEN: number;
|
|
17
|
+
export declare const MAX_KIP_NESTING_DEPTH = 64;
|
|
18
|
+
export declare const MAX_KIP_BATCH_COMMANDS = 256;
|
|
19
|
+
/**
|
|
20
|
+
* Rejects source that exceeds a parser budget.
|
|
21
|
+
*
|
|
22
|
+
* The bracket scan must skip line comments exactly the way the lexer does.
|
|
23
|
+
* Counting a `"` inside a comment would latch the scanner into string mode
|
|
24
|
+
* for the rest of the input, after which every bracket goes uncounted and the
|
|
25
|
+
* depth ceiling silently stops existing — the failure mode is a guard that
|
|
26
|
+
* looks present and defends nothing.
|
|
27
|
+
*
|
|
28
|
+
* @throws {KipSyntaxError} `KIP_4002` when a budget is exceeded.
|
|
29
|
+
*/
|
|
30
|
+
export declare function checkBudget(source: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Rejects an over-long batch of commands.
|
|
33
|
+
*
|
|
34
|
+
* @throws {KipSyntaxError} `KIP_4002` when the batch is too large.
|
|
35
|
+
*/
|
|
36
|
+
export declare function checkBatchBudget(count: number): void;
|
|
37
|
+
//# sourceMappingURL=budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,QAAa,CAAA;AAC3C,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA8DhD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMpD"}
|
package/dist/budget.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { resourceExhausted } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parser budgets.
|
|
4
|
+
*
|
|
5
|
+
* KIP source reaches a server as agent-generated text, so the parser is an
|
|
6
|
+
* attack surface before it is a convenience. `parse` is recursive descent:
|
|
7
|
+
* without a depth ceiling, `[[[[...` recurses until the JavaScript stack
|
|
8
|
+
* overflows, and in an environment that shares one stack across requests
|
|
9
|
+
* (a Cloudflare Worker isolate, say) that takes the whole runtime down rather
|
|
10
|
+
* than failing the one request. The check runs on raw text, before a single
|
|
11
|
+
* token is produced, so a hostile input costs one linear scan.
|
|
12
|
+
*
|
|
13
|
+
* The values mirror `MAX_KIP_*` in `anda_kip`'s parser: a command rejected by
|
|
14
|
+
* one KIP engine's budget must be rejected by every other engine's, or the
|
|
15
|
+
* same command succeeds on one deployment and fails on another.
|
|
16
|
+
*/
|
|
17
|
+
export const MAX_KIP_INPUT_LEN = 256 * 1024;
|
|
18
|
+
export const MAX_KIP_NESTING_DEPTH = 64;
|
|
19
|
+
export const MAX_KIP_BATCH_COMMANDS = 256;
|
|
20
|
+
/**
|
|
21
|
+
* Rejects source that exceeds a parser budget.
|
|
22
|
+
*
|
|
23
|
+
* The bracket scan must skip line comments exactly the way the lexer does.
|
|
24
|
+
* Counting a `"` inside a comment would latch the scanner into string mode
|
|
25
|
+
* for the rest of the input, after which every bracket goes uncounted and the
|
|
26
|
+
* depth ceiling silently stops existing — the failure mode is a guard that
|
|
27
|
+
* looks present and defends nothing.
|
|
28
|
+
*
|
|
29
|
+
* @throws {KipSyntaxError} `KIP_4002` when a budget is exceeded.
|
|
30
|
+
*/
|
|
31
|
+
export function checkBudget(source) {
|
|
32
|
+
if (source.length > MAX_KIP_INPUT_LEN) {
|
|
33
|
+
throw resourceExhausted(`KIP input length ${source.length} exceeds maximum ${MAX_KIP_INPUT_LEN}`);
|
|
34
|
+
}
|
|
35
|
+
let depth = 0;
|
|
36
|
+
const stack = [];
|
|
37
|
+
let inString = false;
|
|
38
|
+
let escaped = false;
|
|
39
|
+
let inLineComment = false;
|
|
40
|
+
let prevSlash = false;
|
|
41
|
+
for (let i = 0; i < source.length; i++) {
|
|
42
|
+
const ch = source[i];
|
|
43
|
+
if (inLineComment) {
|
|
44
|
+
if (ch === '\n')
|
|
45
|
+
inLineComment = false;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (inString) {
|
|
49
|
+
prevSlash = false;
|
|
50
|
+
if (escaped) {
|
|
51
|
+
escaped = false;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (ch === '\\')
|
|
55
|
+
escaped = true;
|
|
56
|
+
else if (ch === '"')
|
|
57
|
+
inString = false;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (ch === '/') {
|
|
61
|
+
if (prevSlash) {
|
|
62
|
+
inLineComment = true;
|
|
63
|
+
prevSlash = false;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
prevSlash = true;
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
prevSlash = false;
|
|
71
|
+
if (ch === '"') {
|
|
72
|
+
inString = true;
|
|
73
|
+
}
|
|
74
|
+
else if (ch === '(' || ch === '[' || ch === '{') {
|
|
75
|
+
stack.push(ch);
|
|
76
|
+
depth = stack.length;
|
|
77
|
+
if (depth > MAX_KIP_NESTING_DEPTH) {
|
|
78
|
+
throw resourceExhausted(`KIP input nesting exceeds maximum ${MAX_KIP_NESTING_DEPTH}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else if (ch === ')') {
|
|
82
|
+
if (stack[stack.length - 1] === '(')
|
|
83
|
+
stack.pop();
|
|
84
|
+
}
|
|
85
|
+
else if (ch === ']') {
|
|
86
|
+
if (stack[stack.length - 1] === '[')
|
|
87
|
+
stack.pop();
|
|
88
|
+
}
|
|
89
|
+
else if (ch === '}') {
|
|
90
|
+
if (stack[stack.length - 1] === '{')
|
|
91
|
+
stack.pop();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Rejects an over-long batch of commands.
|
|
97
|
+
*
|
|
98
|
+
* @throws {KipSyntaxError} `KIP_4002` when the batch is too large.
|
|
99
|
+
*/
|
|
100
|
+
export function checkBatchBudget(count) {
|
|
101
|
+
if (count > MAX_KIP_BATCH_COMMANDS) {
|
|
102
|
+
throw resourceExhausted(`KIP batch of ${count} commands exceeds maximum ${MAX_KIP_BATCH_COMMANDS}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAA;AACvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAA;AAEzC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACtC,MAAM,iBAAiB,CACrB,oBAAoB,MAAM,CAAC,MAAM,oBAAoB,iBAAiB,EAAE,CACzE,CAAA;IACH,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,aAAa,GAAG,KAAK,CAAA;IACzB,IAAI,SAAS,GAAG,KAAK,CAAA;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;QAErB,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,EAAE,KAAK,IAAI;gBAAE,aAAa,GAAG,KAAK,CAAA;YACtC,SAAQ;QACV,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,GAAG,KAAK,CAAA;YACjB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,KAAK,CAAA;gBACf,SAAQ;YACV,CAAC;YACD,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,GAAG,IAAI,CAAA;iBAC1B,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAA;YACrC,SAAQ;QACV,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,SAAS,EAAE,CAAC;gBACd,aAAa,GAAG,IAAI,CAAA;gBACpB,SAAS,GAAG,KAAK,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,IAAI,CAAA;YAClB,CAAC;YACD,SAAQ;QACV,CAAC;QACD,SAAS,GAAG,KAAK,CAAA;QAEjB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAA;QACjB,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACd,KAAK,GAAG,KAAK,CAAC,MAAM,CAAA;YACpB,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;gBAClC,MAAM,iBAAiB,CACrB,qCAAqC,qBAAqB,EAAE,CAC7D,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;gBAAE,KAAK,CAAC,GAAG,EAAE,CAAA;QAClD,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;gBAAE,KAAK,CAAC,GAAG,EAAE,CAAA;QAClD,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;gBAAE,KAAK,CAAC,GAAG,EAAE,CAAA;QAClD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,KAAK,GAAG,sBAAsB,EAAE,CAAC;QACnC,MAAM,iBAAiB,CACrB,gBAAgB,KAAK,6BAA6B,sBAAsB,EAAE,CAC3E,CAAA;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAMvC,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAkIrD"}
|
package/dist/diagnostics.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { tokenize } from './lexer.js';
|
|
2
2
|
import { parse } from './parser.js';
|
|
3
|
+
import { analyzeSemantics } from './semantics.js';
|
|
3
4
|
import { TokenType } from './token.js';
|
|
4
5
|
/**
|
|
5
6
|
* Runs diagnostics on KIP source code.
|
|
@@ -119,8 +120,13 @@ export function diagnose(source) {
|
|
|
119
120
|
});
|
|
120
121
|
}
|
|
121
122
|
// Phase 3: Parser diagnostics
|
|
122
|
-
const { diagnostics: parseDiags } = parse(source);
|
|
123
|
+
const { ast, diagnostics: parseDiags } = parse(source);
|
|
123
124
|
diagnostics.push(...parseDiags);
|
|
125
|
+
// Phase 4: Semantic checks (only when the AST parsed cleanly, to avoid
|
|
126
|
+
// cascading false positives from error-recovery placeholders).
|
|
127
|
+
if (!parseDiags.some((d) => d.severity === 'error')) {
|
|
128
|
+
diagnostics.push(...analyzeSemantics(ast));
|
|
129
|
+
}
|
|
124
130
|
return diagnostics;
|
|
125
131
|
}
|
|
126
132
|
function isJsonNumberLiteral(value) {
|
package/dist/diagnostics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAStC;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,WAAW,GAAiB,EAAE,CAAA;IAEpC,mCAAmC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAStC;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,WAAW,GAAiB,EAAE,CAAA;IAEpC,mCAAmC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YACnC,WAAW,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;oBAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;iBAC/D;gBACD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,yBAAyB,GAAG,CAAC,KAAK,GAAG;gBAC9C,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAA;QACJ,CAAC;QAED,iCAAiC;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE;wBACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;wBAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;qBAC/D;oBACD,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,6BAA6B;oBACtC,IAAI,EAAE,6BAA6B;iBACpC,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,WAAW,CAAC,IAAI,CAAC;wBACf,KAAK,EAAE;4BACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;4BAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;yBAC/D;wBACD,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,6CAA6C;wBACtD,IAAI,EAAE,wBAAwB;qBAC/B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrE,WAAW,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;oBAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;iBAC/D;gBACD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,6BAA6B;gBACtC,IAAI,EAAE,wBAAwB;aAC/B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAqD,EAAE,CAAA;IACzE,MAAM,OAAO,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACxE,MAAM,OAAO,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAExE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IACE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;YAC7B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;YAC7B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,QAAQ,EAC/B,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAC5E,CAAC;aAAM,IACL,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;YAC7B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;YAC7B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,QAAQ,EAC/B,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACnC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE;wBACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;wBAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;qBAChD;oBACD,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,sBAAsB,GAAG,CAAC,KAAK,GAAG;oBAC3C,IAAI,EAAE,2BAA2B;iBAClC,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;gBAClD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1B,WAAW,CAAC,IAAI,CAAC;wBACf,KAAK,EAAE;4BACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;4BAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;yBAChD;wBACD,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,iCAAiC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,GAAG;wBACrF,IAAI,EAAE,4BAA4B;qBACnC,CAAC,CAAA;gBACJ,CAAC;gBACD,YAAY,CAAC,GAAG,EAAE,CAAA;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,WAAW,CAAC,IAAI,CAAC;YACf,KAAK,EAAE;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;gBACvD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;aAC1D;YACD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,aAAa,QAAQ,CAAC,IAAI,GAAG;YACtC,IAAI,EAAE,0BAA0B;SACjC,CAAC,CAAA;IACJ,CAAC;IAED,8BAA8B;IAC9B,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;IACtD,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;IAE/B,uEAAuE;IACvE,+DAA+D;IAC/D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;QACpD,WAAW,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,+CAA+C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACpE,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Range } from './token.js';
|
|
2
|
+
/**
|
|
3
|
+
* The subset of the KIP error taxonomy this package can produce.
|
|
4
|
+
*
|
|
5
|
+
* A KIP engine owns the full taxonomy (schema, logic and execution codes);
|
|
6
|
+
* a language toolkit only ever reaches the parse-time codes. The `hint` that
|
|
7
|
+
* accompanies each code on the wire is deliberately *not* duplicated here —
|
|
8
|
+
* it is engine-side wire contract, and a second copy that drifts is worse
|
|
9
|
+
* than no copy at all.
|
|
10
|
+
*/
|
|
11
|
+
export type KipSyntaxCode = 'KIP_1001' | 'KIP_1002' | 'KIP_4002';
|
|
12
|
+
/**
|
|
13
|
+
* A fatal, single-error view of a KIP source problem.
|
|
14
|
+
*
|
|
15
|
+
* `parse` reports every problem it can recover from as a `Diagnostic`, which
|
|
16
|
+
* is what an editor wants. An engine wants the opposite: the first thing that
|
|
17
|
+
* makes the command unexecutable, thrown, with a code it can put on the wire.
|
|
18
|
+
* `lower` and `checkBudget` therefore throw this instead of accumulating.
|
|
19
|
+
*/
|
|
20
|
+
export declare class KipSyntaxError extends Error {
|
|
21
|
+
readonly code: KipSyntaxCode;
|
|
22
|
+
readonly range: Range | undefined;
|
|
23
|
+
constructor(code: KipSyntaxCode, message: string, range?: Range);
|
|
24
|
+
}
|
|
25
|
+
/** `KIP_1001 InvalidSyntax` — the command does not parse, or violates a grammar rule. */
|
|
26
|
+
export declare function invalidSyntax(message: string, range?: Range): KipSyntaxError;
|
|
27
|
+
/** `KIP_4002 ResourceExhausted` — the input exceeds a parser budget. */
|
|
28
|
+
export declare function resourceExhausted(message: string): KipSyntaxError;
|
|
29
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAA;AAEhE;;;;;;;GAOG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAA;gBAErB,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAMhE;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,cAAc,CAE5E;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAEjE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A fatal, single-error view of a KIP source problem.
|
|
3
|
+
*
|
|
4
|
+
* `parse` reports every problem it can recover from as a `Diagnostic`, which
|
|
5
|
+
* is what an editor wants. An engine wants the opposite: the first thing that
|
|
6
|
+
* makes the command unexecutable, thrown, with a code it can put on the wire.
|
|
7
|
+
* `lower` and `checkBudget` therefore throw this instead of accumulating.
|
|
8
|
+
*/
|
|
9
|
+
export class KipSyntaxError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
range;
|
|
12
|
+
constructor(code, message, range) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'KipSyntaxError';
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.range = range;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** `KIP_1001 InvalidSyntax` — the command does not parse, or violates a grammar rule. */
|
|
20
|
+
export function invalidSyntax(message, range) {
|
|
21
|
+
return new KipSyntaxError('KIP_1001', message, range);
|
|
22
|
+
}
|
|
23
|
+
/** `KIP_4002 ResourceExhausted` — the input exceeds a parser budget. */
|
|
24
|
+
export function resourceExhausted(message) {
|
|
25
|
+
return new KipSyntaxError('KIP_4002', message);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAaA;;;;;;;GAOG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAe;IACnB,KAAK,CAAmB;IAEjC,YAAY,IAAmB,EAAE,OAAe,EAAE,KAAa;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF;AAED,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAa;IAC1D,OAAO,IAAI,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;AACvD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,IAAI,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAChD,CAAC"}
|