hpp-lang 0.6.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/README.md +29 -0
- package/dist/ast.d.ts +89 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/capabilities.d.ts +75 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +181 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +27 -0
- package/dist/errors.js.map +1 -0
- package/dist/examples.d.ts +9 -0
- package/dist/examples.d.ts.map +1 -0
- package/dist/examples.js +780 -0
- package/dist/examples.js.map +1 -0
- package/dist/extensions/line/index.d.ts +45 -0
- package/dist/extensions/line/index.d.ts.map +1 -0
- package/dist/extensions/line/index.js +99 -0
- package/dist/extensions/line/index.js.map +1 -0
- package/dist/extensions/maze/index.d.ts +37 -0
- package/dist/extensions/maze/index.d.ts.map +1 -0
- package/dist/extensions/maze/index.js +43 -0
- package/dist/extensions/maze/index.js.map +1 -0
- package/dist/extensions/soccer/index.d.ts +8 -0
- package/dist/extensions/soccer/index.d.ts.map +1 -0
- package/dist/extensions/soccer/index.js +93 -0
- package/dist/extensions/soccer/index.js.map +1 -0
- package/dist/hardware.d.ts +44 -0
- package/dist/hardware.d.ts.map +1 -0
- package/dist/hardware.js +2 -0
- package/dist/hardware.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/interpreter.d.ts +88 -0
- package/dist/interpreter.d.ts.map +1 -0
- package/dist/interpreter.js +795 -0
- package/dist/interpreter.js.map +1 -0
- package/dist/lexer.d.ts +21 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +175 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +60 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +569 -0
- package/dist/parser.js.map +1 -0
- package/dist/robotics/actions.d.ts +13 -0
- package/dist/robotics/actions.d.ts.map +1 -0
- package/dist/robotics/actions.js +38 -0
- package/dist/robotics/actions.js.map +1 -0
- package/dist/robotics/contracts.d.ts +88 -0
- package/dist/robotics/contracts.d.ts.map +1 -0
- package/dist/robotics/contracts.js +31 -0
- package/dist/robotics/contracts.js.map +1 -0
- package/dist/robotics/index.d.ts +21 -0
- package/dist/robotics/index.d.ts.map +1 -0
- package/dist/robotics/index.js +19 -0
- package/dist/robotics/index.js.map +1 -0
- package/dist/robotics/motion.d.ts +139 -0
- package/dist/robotics/motion.d.ts.map +1 -0
- package/dist/robotics/motion.js +248 -0
- package/dist/robotics/motion.js.map +1 -0
- package/dist/robotics/sensors.d.ts +15 -0
- package/dist/robotics/sensors.d.ts.map +1 -0
- package/dist/robotics/sensors.js +12 -0
- package/dist/robotics/sensors.js.map +1 -0
- package/dist/robotics/snapshot.d.ts +12 -0
- package/dist/robotics/snapshot.d.ts.map +1 -0
- package/dist/robotics/snapshot.js +9 -0
- package/dist/robotics/snapshot.js.map +1 -0
- package/dist/robotics/types.d.ts +12 -0
- package/dist/robotics/types.d.ts.map +1 -0
- package/dist/robotics/types.js +9 -0
- package/dist/robotics/types.js.map +1 -0
- package/dist/runtime.d.ts +81 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +150 -0
- package/dist/runtime.js.map +1 -0
- package/dist/tokens.d.ts +33 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +97 -0
- package/dist/tokens.js.map +1 -0
- package/dist/version.d.ts +14 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 HUGO S. DIAS
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# hpp-lang (package)
|
|
2
|
+
|
|
3
|
+
H++, a bilingual educational programming language for autonomous robotics.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { Lexer, Parser, Interpreter, HppRuntime, compile } from 'hpp-lang';
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Layout
|
|
10
|
+
|
|
11
|
+
- `src/` — core (`ast`, `tokens`, `lexer`, `parser`, `interpreter`, `errors`,
|
|
12
|
+
`version`), robotics (`hardware`, `capabilities`, `runtime`,
|
|
13
|
+
`robotics/` — incl. the Motion layer: `contracts`, `motion`, `index`),
|
|
14
|
+
domain extensions (`extensions/soccer|line|maze`) and the `EXAMPLES`
|
|
15
|
+
program library (`examples.ts`).
|
|
16
|
+
- Executable `.hpp` counterparts of the library live in `/examples`
|
|
17
|
+
(repo root), organized by domain.
|
|
18
|
+
|
|
19
|
+
## Versions
|
|
20
|
+
|
|
21
|
+
Core `0.6.0` · Robotics Motion `0.1.0` · soccer `0.4.0` · line `0.2.0` ·
|
|
22
|
+
maze `0.2.0` — versioned independently (see `src/version.ts` and each
|
|
23
|
+
`extensions/*/index.ts`).
|
|
24
|
+
|
|
25
|
+
## Build (NPM)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run build # emits dist/ with .js + .d.ts + source maps
|
|
29
|
+
```
|
package/dist/ast.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { ActionName } from './tokens.js';
|
|
2
|
+
/** Árvore sintática do H++ (nós com linha p/ erros amigáveis). */
|
|
3
|
+
export type Expr = {
|
|
4
|
+
kind: 'num';
|
|
5
|
+
value: number;
|
|
6
|
+
line: number;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'str';
|
|
9
|
+
value: string;
|
|
10
|
+
line: number;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'bool';
|
|
13
|
+
value: boolean;
|
|
14
|
+
line: number;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'var';
|
|
17
|
+
name: string;
|
|
18
|
+
line: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'unary';
|
|
21
|
+
op: '-' | 'NOT';
|
|
22
|
+
expr: Expr;
|
|
23
|
+
line: number;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'binary';
|
|
26
|
+
op: string;
|
|
27
|
+
left: Expr;
|
|
28
|
+
right: Expr;
|
|
29
|
+
line: number;
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'call';
|
|
32
|
+
name: string;
|
|
33
|
+
args: Expr[];
|
|
34
|
+
line: number;
|
|
35
|
+
};
|
|
36
|
+
export type Stmt = {
|
|
37
|
+
kind: 'assign';
|
|
38
|
+
name: string;
|
|
39
|
+
expr: Expr;
|
|
40
|
+
line: number;
|
|
41
|
+
} | {
|
|
42
|
+
kind: 'expr';
|
|
43
|
+
expr: Expr;
|
|
44
|
+
line: number;
|
|
45
|
+
} | {
|
|
46
|
+
kind: 'action';
|
|
47
|
+
name: ActionName;
|
|
48
|
+
args: Expr[];
|
|
49
|
+
line: number;
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'if';
|
|
52
|
+
cond: Expr;
|
|
53
|
+
then: Stmt[];
|
|
54
|
+
otherwise: Stmt[];
|
|
55
|
+
line: number;
|
|
56
|
+
} | {
|
|
57
|
+
kind: 'while';
|
|
58
|
+
cond: Expr;
|
|
59
|
+
body: Stmt[];
|
|
60
|
+
line: number;
|
|
61
|
+
} | {
|
|
62
|
+
kind: 'repeat';
|
|
63
|
+
count: Expr;
|
|
64
|
+
body: Stmt[];
|
|
65
|
+
line: number;
|
|
66
|
+
} | {
|
|
67
|
+
kind: 'for';
|
|
68
|
+
name: string;
|
|
69
|
+
from: Expr;
|
|
70
|
+
to: Expr;
|
|
71
|
+
step: Expr | null;
|
|
72
|
+
body: Stmt[];
|
|
73
|
+
line: number;
|
|
74
|
+
} | {
|
|
75
|
+
kind: 'func';
|
|
76
|
+
name: string;
|
|
77
|
+
params: string[];
|
|
78
|
+
body: Stmt[];
|
|
79
|
+
line: number;
|
|
80
|
+
} | {
|
|
81
|
+
kind: 'return';
|
|
82
|
+
expr: Expr | null;
|
|
83
|
+
line: number;
|
|
84
|
+
} | {
|
|
85
|
+
kind: 'always';
|
|
86
|
+
body: Stmt[];
|
|
87
|
+
line: number;
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
|
package/dist/ast.js
ADDED
package/dist/ast.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de capacidades (§8): vocabulário comum para descrever o que um
|
|
3
|
+
* robô/hardware oferece, sem amarrar o núcleo a nenhum domínio.
|
|
4
|
+
*
|
|
5
|
+
* Ex.: Soccer tem {motor, ball_sensor, kicker, ...}; Line tem {motor, line_sensor}.
|
|
6
|
+
*/
|
|
7
|
+
import type { ActionName, ActionSpec } from './tokens.js';
|
|
8
|
+
import type { Stmt } from './ast.js';
|
|
9
|
+
/**
|
|
10
|
+
* O que um robô/hardware declara possuir. As cinco primeiras famílias são
|
|
11
|
+
* as da camada Robotics (§20); o resto é capability de domínio.
|
|
12
|
+
*/
|
|
13
|
+
export type Capability = 'motor' | 'motor_individual' | 'motor_left' | 'motor_right' | 'differential_drive' | 'holonomic_drive' | 'encoder' | 'odometry' | 'imu' | 'compass' | 'distance_sensor' | 'wall_detector' | 'line_sensor' | 'ball_sensor' | 'radio' | 'kicker' | 'dribbler';
|
|
14
|
+
/** Descritor de extensão de domínio (soccer, line, maze, hardware...). */
|
|
15
|
+
export interface ExtensionDescriptor {
|
|
16
|
+
/** Id estável, ex.: 'soccer'. */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Versão da extensão (independente do core e do simulador). */
|
|
19
|
+
version: string;
|
|
20
|
+
/** Domínio legível, ex.: 'Soccer Infrared'. */
|
|
21
|
+
domain: string;
|
|
22
|
+
/** Capacidades que um hardware deste domínio pode oferecer. */
|
|
23
|
+
capabilities: Capability[];
|
|
24
|
+
/** Chaves de sensores (minúsculas) que a extensão define. */
|
|
25
|
+
sensors: string[];
|
|
26
|
+
/** Ações de DOMÍNIO que a extensão suporta. As primitivas Robotics
|
|
27
|
+
* (ANDAR/VOLTAR/PARAR/GIRAR/ESPERAR/…) não precisam ser listadas: valem
|
|
28
|
+
* em todo domínio (§33). */
|
|
29
|
+
actions: string[];
|
|
30
|
+
/**
|
|
31
|
+
* Capacidades exigidas por ação (passo incremental rumo a descritores
|
|
32
|
+
* completos de Sensor/Action; §12/§30). Ausente = sem verificação.
|
|
33
|
+
* Ex.: `{ kick: ['kicker'], dribble: ['dribbler'] }`.
|
|
34
|
+
*/
|
|
35
|
+
requires?: Partial<Record<ActionName, Capability[]>>;
|
|
36
|
+
/**
|
|
37
|
+
* Verbos do domínio: palavra (MAIÚSCULAS, sem acento) → ação canônica.
|
|
38
|
+
* Dá a cada domínio seus verbos sem tocar a gramática do núcleo.
|
|
39
|
+
* Ex. Line: `{ SEGUIR: { name: 'aimMain', args: 0 } }`.
|
|
40
|
+
* Verbos do núcleo têm precedência sobre estes.
|
|
41
|
+
*/
|
|
42
|
+
verbs?: Record<string, ActionSpec>;
|
|
43
|
+
/**
|
|
44
|
+
* Capacidades exigidas por SENSOR (leitura). Ausente = sem verificação.
|
|
45
|
+
* Ex. soccer: `{ bussola: ['compass'], linha_frente: ['line_sensor'] }`.
|
|
46
|
+
*/
|
|
47
|
+
sensorRequires?: Record<string, Capability[]>;
|
|
48
|
+
}
|
|
49
|
+
/** Lista o que falta em `have` para satisfazer `need`. Vazio = OK. */
|
|
50
|
+
export declare function checkRequirements(have: Capability[], need: Capability[]): Capability[];
|
|
51
|
+
/** Mensagem didática quando faltam capacidades. */
|
|
52
|
+
export declare function missingCapabilitiesMessage(missing: Capability[], extensionId: string): string;
|
|
53
|
+
/** Coleta os nomes canônicos de ação usados num programa (AST já compilada). */
|
|
54
|
+
export declare function collectProgramActions(statements: Stmt[]): ActionName[];
|
|
55
|
+
/**
|
|
56
|
+
* Verifica se um programa cabe nas capacidades do hardware (§9/§32).
|
|
57
|
+
* Retorna mensagem pedagógica ou null se OK. Não executa nada.
|
|
58
|
+
* Quatro barreiras:
|
|
59
|
+
* 1. ação fora do vocabulário da extensão — **exceto** as primitivas
|
|
60
|
+
* Robotics, que valem em qualquer domínio (§33);
|
|
61
|
+
* 2. capacidades exigidas (via `requires`, semântica E) ausentes;
|
|
62
|
+
* 3. capacidades da primitiva de movimento ausentes (semântica OU, §8);
|
|
63
|
+
* 4. SENSORES exigidos (via `sensorRequires`) ausentes.
|
|
64
|
+
* Sem entrada = sem verificação.
|
|
65
|
+
*/
|
|
66
|
+
export declare function checkProgramActions(statements: Stmt[], have: Capability[], extension: Pick<ExtensionDescriptor, 'id' | 'actions' | 'requires' | 'sensors' | 'sensorRequires'>): string | null;
|
|
67
|
+
/**
|
|
68
|
+
* Sensores lidos pelo programa: referências a variáveis que NÃO foram
|
|
69
|
+
* declaradas no próprio programa (atribuição, parâmetro, laço, função),
|
|
70
|
+
* filtradas pelo vocabulário de sensores da extensão. Limitação conhecida:
|
|
71
|
+
* análise é do programa inteiro (não por fluxo) — sombrear um sensor com
|
|
72
|
+
* variável de mesmo nome desliga a verificação para ele.
|
|
73
|
+
*/
|
|
74
|
+
export declare function collectProgramSensors(statements: Stmt[], vocabulary: string[]): string[];
|
|
75
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,KAAK,EAAE,IAAI,EAAQ,MAAM,UAAU,CAAC;AAG3C;;;GAGG;AACH,MAAM,MAAM,UAAU,GAElB,OAAO,GACP,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,oBAAoB,GACpB,iBAAiB,GAEjB,SAAS,GACT,UAAU,GAEV,KAAK,GACL,SAAS,GAET,iBAAiB,GACjB,eAAe,GACf,aAAa,GACb,aAAa,GAEb,OAAO,GACP,QAAQ,GACR,UAAU,CAAC;AAEf,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;gCAE4B;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IACrD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;CAC/C;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAEtF;AAED,mDAAmD;AACnD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAM7F;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CA8BtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,IAAI,EAAE,EAClB,IAAI,EAAE,UAAU,EAAE,EAClB,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,CAAC,GACjG,MAAM,GAAG,IAAI,CAoCf;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA0ExF"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { ACTION_PT } from './tokens.js';
|
|
2
|
+
import { isMotionAction, missingMotionCapability } from './robotics/motion.js';
|
|
3
|
+
/** Lista o que falta em `have` para satisfazer `need`. Vazio = OK. */
|
|
4
|
+
export function checkRequirements(have, need) {
|
|
5
|
+
return need.filter((c) => !have.includes(c));
|
|
6
|
+
}
|
|
7
|
+
/** Mensagem didática quando faltam capacidades. */
|
|
8
|
+
export function missingCapabilitiesMessage(missing, extensionId) {
|
|
9
|
+
return (`Este programa precisa de: ${missing.join(', ')}. ` +
|
|
10
|
+
`O robô atual (domínio "${extensionId}") não tem isso — ` +
|
|
11
|
+
`troque de robô ou adapte o programa.`);
|
|
12
|
+
}
|
|
13
|
+
/** Coleta os nomes canônicos de ação usados num programa (AST já compilada). */
|
|
14
|
+
export function collectProgramActions(statements) {
|
|
15
|
+
const found = new Set();
|
|
16
|
+
const walk = (list) => {
|
|
17
|
+
for (const s of list) {
|
|
18
|
+
switch (s.kind) {
|
|
19
|
+
case 'action':
|
|
20
|
+
found.add(s.name);
|
|
21
|
+
break;
|
|
22
|
+
case 'if':
|
|
23
|
+
walk(s.then);
|
|
24
|
+
walk(s.otherwise);
|
|
25
|
+
break;
|
|
26
|
+
case 'while':
|
|
27
|
+
case 'repeat':
|
|
28
|
+
case 'always':
|
|
29
|
+
walk(s.body);
|
|
30
|
+
break;
|
|
31
|
+
case 'for':
|
|
32
|
+
walk(s.body);
|
|
33
|
+
break;
|
|
34
|
+
case 'func':
|
|
35
|
+
walk(s.body);
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
walk(statements);
|
|
43
|
+
return [...found];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Verifica se um programa cabe nas capacidades do hardware (§9/§32).
|
|
47
|
+
* Retorna mensagem pedagógica ou null se OK. Não executa nada.
|
|
48
|
+
* Quatro barreiras:
|
|
49
|
+
* 1. ação fora do vocabulário da extensão — **exceto** as primitivas
|
|
50
|
+
* Robotics, que valem em qualquer domínio (§33);
|
|
51
|
+
* 2. capacidades exigidas (via `requires`, semântica E) ausentes;
|
|
52
|
+
* 3. capacidades da primitiva de movimento ausentes (semântica OU, §8);
|
|
53
|
+
* 4. SENSORES exigidos (via `sensorRequires`) ausentes.
|
|
54
|
+
* Sem entrada = sem verificação.
|
|
55
|
+
*/
|
|
56
|
+
export function checkProgramActions(statements, have, extension) {
|
|
57
|
+
const missing = new Set();
|
|
58
|
+
const anyOf = new Set();
|
|
59
|
+
const lacking = [];
|
|
60
|
+
for (const name of collectProgramActions(statements)) {
|
|
61
|
+
if (!isMotionAction(name) && !extension.actions.includes(name)) {
|
|
62
|
+
lacking.push(`${ACTION_PT[name]} (ação desconhecida neste domínio)`);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const need = extension.requires?.[name] ?? [];
|
|
66
|
+
const absent = checkRequirements(have, need);
|
|
67
|
+
const absentAny = missingMotionCapability(name, have) ?? [];
|
|
68
|
+
if (absent.length > 0 || absentAny.length > 0) {
|
|
69
|
+
lacking.push(ACTION_PT[name]);
|
|
70
|
+
absent.forEach((c) => missing.add(c));
|
|
71
|
+
absentAny.forEach((c) => anyOf.add(c));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const name of collectProgramSensors(statements, extension.sensors)) {
|
|
75
|
+
const need = extension.sensorRequires?.[name] ?? [];
|
|
76
|
+
const absent = checkRequirements(have, need);
|
|
77
|
+
if (absent.length > 0) {
|
|
78
|
+
lacking.push(`${name} (sensor sem capacidade neste robô)`);
|
|
79
|
+
absent.forEach((c) => missing.add(c));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (lacking.length === 0)
|
|
83
|
+
return null;
|
|
84
|
+
const needParts = [];
|
|
85
|
+
if (missing.size > 0)
|
|
86
|
+
needParts.push(`precisa de: ${[...missing].join(', ')}`);
|
|
87
|
+
if (anyOf.size > 0)
|
|
88
|
+
needParts.push(`precisa de uma entre: ${[...anyOf].join(' ou ')}`);
|
|
89
|
+
const caps = needParts.length > 0 ? ` (${needParts.join('; ')})` : '';
|
|
90
|
+
return (`Este programa usa ${lacking.join(', ')}, ` +
|
|
91
|
+
`mas o robô atual não possui a capacidade necessária${caps}. ` +
|
|
92
|
+
`Domínio "${extension.id}": troque de robô ou adapte o programa.`);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Sensores lidos pelo programa: referências a variáveis que NÃO foram
|
|
96
|
+
* declaradas no próprio programa (atribuição, parâmetro, laço, função),
|
|
97
|
+
* filtradas pelo vocabulário de sensores da extensão. Limitação conhecida:
|
|
98
|
+
* análise é do programa inteiro (não por fluxo) — sombrear um sensor com
|
|
99
|
+
* variável de mesmo nome desliga a verificação para ele.
|
|
100
|
+
*/
|
|
101
|
+
export function collectProgramSensors(statements, vocabulary) {
|
|
102
|
+
const read = new Set();
|
|
103
|
+
const declared = new Set();
|
|
104
|
+
const walkExpr = (e) => {
|
|
105
|
+
switch (e.kind) {
|
|
106
|
+
case 'var':
|
|
107
|
+
read.add(e.name);
|
|
108
|
+
break;
|
|
109
|
+
case 'unary':
|
|
110
|
+
walkExpr(e.expr);
|
|
111
|
+
break;
|
|
112
|
+
case 'binary':
|
|
113
|
+
walkExpr(e.left);
|
|
114
|
+
walkExpr(e.right);
|
|
115
|
+
break;
|
|
116
|
+
case 'call':
|
|
117
|
+
for (const a of e.args)
|
|
118
|
+
walkExpr(a);
|
|
119
|
+
break;
|
|
120
|
+
default:
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const walk = (list) => {
|
|
125
|
+
for (const s of list) {
|
|
126
|
+
switch (s.kind) {
|
|
127
|
+
case 'assign':
|
|
128
|
+
declared.add(s.name);
|
|
129
|
+
walkExpr(s.expr);
|
|
130
|
+
break;
|
|
131
|
+
case 'func':
|
|
132
|
+
declared.add(s.name);
|
|
133
|
+
for (const p of s.params)
|
|
134
|
+
declared.add(p);
|
|
135
|
+
walk(s.body);
|
|
136
|
+
break;
|
|
137
|
+
case 'for':
|
|
138
|
+
declared.add(s.name);
|
|
139
|
+
walkExpr(s.from);
|
|
140
|
+
walkExpr(s.to);
|
|
141
|
+
if (s.step)
|
|
142
|
+
walkExpr(s.step);
|
|
143
|
+
walk(s.body);
|
|
144
|
+
break;
|
|
145
|
+
case 'if':
|
|
146
|
+
walkExpr(s.cond);
|
|
147
|
+
walk(s.then);
|
|
148
|
+
walk(s.otherwise);
|
|
149
|
+
break;
|
|
150
|
+
case 'while':
|
|
151
|
+
walkExpr(s.cond);
|
|
152
|
+
walk(s.body);
|
|
153
|
+
break;
|
|
154
|
+
case 'repeat':
|
|
155
|
+
walkExpr(s.count);
|
|
156
|
+
walk(s.body);
|
|
157
|
+
break;
|
|
158
|
+
case 'always':
|
|
159
|
+
walk(s.body);
|
|
160
|
+
break;
|
|
161
|
+
case 'return':
|
|
162
|
+
if (s.expr)
|
|
163
|
+
walkExpr(s.expr);
|
|
164
|
+
break;
|
|
165
|
+
case 'expr':
|
|
166
|
+
walkExpr(s.expr);
|
|
167
|
+
break;
|
|
168
|
+
case 'action':
|
|
169
|
+
for (const a of s.args)
|
|
170
|
+
walkExpr(a);
|
|
171
|
+
break;
|
|
172
|
+
default:
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
walk(statements);
|
|
178
|
+
const vocab = new Set(vocabulary);
|
|
179
|
+
return [...read].filter((n) => !declared.has(n) && vocab.has(n));
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAkE/E,sEAAsE;AACtE,MAAM,UAAU,iBAAiB,CAAC,IAAkB,EAAE,IAAkB;IACtE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,0BAA0B,CAAC,OAAqB,EAAE,WAAmB;IACnF,OAAO,CACL,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QACnD,0BAA0B,WAAW,oBAAoB;QACzD,sCAAsC,CACvC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAc,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAQ,EAAE;QAClC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,QAAQ;oBACX,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAClB,MAAM;gBACR,KAAK,IAAI;oBACP,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAClB,MAAM;gBACR,KAAK,OAAO,CAAC;gBACb,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ;oBACX,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,KAAK;oBACR,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR;oBACE,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,IAAkB,EAClB,SAAkG;IAElG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAc,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAc,CAAC;IACpC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;YAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO,CACL,qBAAqB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC3C,sDAAsD,IAAI,IAAI;QAC9D,YAAY,SAAS,CAAC,EAAE,yCAAyC,CAClE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAE,UAAoB;IAC5E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,CAAC,CAAO,EAAQ,EAAE;QACjC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM;YACR,KAAK,OAAO;gBACV,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM;YACR,KAAK,QAAQ;gBACX,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjB,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAClB,MAAM;YACR,KAAK,MAAM;gBACT,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI;oBAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACpC,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAQ,EAAE;QAClC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,QAAQ;oBACX,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACrB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACjB,MAAM;gBACR,KAAK,MAAM;oBACT,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACrB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;wBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC1C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,KAAK;oBACR,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACrB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACjB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACf,IAAI,CAAC,CAAC,IAAI;wBAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC7B,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,IAAI;oBACP,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACjB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAClB,MAAM;gBACR,KAAK,OAAO;oBACV,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACjB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,QAAQ;oBACX,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBAClB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,CAAC,IAAI;wBAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC7B,MAAM;gBACR,KAAK,MAAM;oBACT,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACjB,MAAM;gBACR,KAAK,QAAQ;oBACX,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI;wBAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACpC,MAAM;gBACR;oBACE,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,CAAC;IACjB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Erros do H++ (núcleo puro, sem dependências).
|
|
3
|
+
*
|
|
4
|
+
* Extraído de `interpreter.ts` durante a migração para o repositório
|
|
5
|
+
* independente, para que lexer, parser e ferramentas externas possam
|
|
6
|
+
* referenciar o formato de erro sem importar o interpretador.
|
|
7
|
+
* Semântica e mensagens 100% preservadas.
|
|
8
|
+
*/
|
|
9
|
+
/** Erro apresentável ao aluno: sempre com linha e mensagem em português. */
|
|
10
|
+
export interface HppError {
|
|
11
|
+
line: number;
|
|
12
|
+
col: number;
|
|
13
|
+
message: string;
|
|
14
|
+
}
|
|
15
|
+
/** Erro interno de execução (vira `HppError` na borda do `run()`). */
|
|
16
|
+
export declare class RuntimeError extends Error {
|
|
17
|
+
line: number;
|
|
18
|
+
message: string;
|
|
19
|
+
constructor(line: number, message: string);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,4EAA4E;AAC5E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sEAAsE;AACtE,qBAAa,YAAa,SAAQ,KAAK;IAE5B,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;gBADf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM;CAIzB"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Erros do H++ (núcleo puro, sem dependências).
|
|
3
|
+
*
|
|
4
|
+
* Extraído de `interpreter.ts` durante a migração para o repositório
|
|
5
|
+
* independente, para que lexer, parser e ferramentas externas possam
|
|
6
|
+
* referenciar o formato de erro sem importar o interpretador.
|
|
7
|
+
* Semântica e mensagens 100% preservadas.
|
|
8
|
+
*/
|
|
9
|
+
/** Erro interno de execução (vira `HppError` na borda do `run()`). */
|
|
10
|
+
export class RuntimeError extends Error {
|
|
11
|
+
constructor(line, message) {
|
|
12
|
+
super(message);
|
|
13
|
+
Object.defineProperty(this, "line", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true,
|
|
17
|
+
value: line
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(this, "message", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: message
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,sEAAsE;AACtE,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YACS,IAAY,EACZ,OAAe;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHf;;;;mBAAO,IAAI;WAAQ;QACnB;;;;mBAAO,OAAO;WAAQ;IAGxB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,QAAQ,EAAE,OAAO,EA2wB7B,CAAC"}
|