astn 0.111.20 → 0.111.21
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/package.json +6 -6
- package/LICENSE +0 -17
- package/README.md +0 -525
- package/dist/procedures/test.d.ts +0 -2
- package/dist/procedures/test.js +0 -38
- package/dist/test.d.ts +0 -2
- package/dist/test.js +0 -30
- package/documentation/railroad_diagram/diagram/apostrophed_string.png +0 -0
- package/documentation/railroad_diagram/diagram/astn_document.png +0 -0
- package/documentation/railroad_diagram/diagram/backticked_string.png +0 -0
- package/documentation/railroad_diagram/diagram/comment.png +0 -0
- package/documentation/railroad_diagram/diagram/concise_group.png +0 -0
- package/documentation/railroad_diagram/diagram/content.png +0 -0
- package/documentation/railroad_diagram/diagram/dictionary.png +0 -0
- package/documentation/railroad_diagram/diagram/elements.png +0 -0
- package/documentation/railroad_diagram/diagram/escaped_character.png +0 -0
- package/documentation/railroad_diagram/diagram/four_hexadecimal_digits.png +0 -0
- package/documentation/railroad_diagram/diagram/header.png +0 -0
- package/documentation/railroad_diagram/diagram/hexadecimal_digit.png +0 -0
- package/documentation/railroad_diagram/diagram/ignorable.png +0 -0
- package/documentation/railroad_diagram/diagram/include.png +0 -0
- package/documentation/railroad_diagram/diagram/key_value_pairs.png +0 -0
- package/documentation/railroad_diagram/diagram/line_comment.png +0 -0
- package/documentation/railroad_diagram/diagram/list.png +0 -0
- package/documentation/railroad_diagram/diagram/newline_character.png +0 -0
- package/documentation/railroad_diagram/diagram/normal_character.png +0 -0
- package/documentation/railroad_diagram/diagram/normal_or_newline_character.png +0 -0
- package/documentation/railroad_diagram/diagram/quoted_string.png +0 -0
- package/documentation/railroad_diagram/diagram/rr-2.5.png +0 -0
- package/documentation/railroad_diagram/diagram/set_optional_value.png +0 -0
- package/documentation/railroad_diagram/diagram/string.png +0 -0
- package/documentation/railroad_diagram/diagram/string_content_character.png +0 -0
- package/documentation/railroad_diagram/diagram/tagged_value.png +0 -0
- package/documentation/railroad_diagram/diagram/traditional_comment.png +0 -0
- package/documentation/railroad_diagram/diagram/undelimited_string.png +0 -0
- package/documentation/railroad_diagram/diagram/value.png +0 -0
- package/documentation/railroad_diagram/diagram/verbose_group.png +0 -0
- package/documentation/railroad_diagram/diagram/whitespace.png +0 -0
- package/documentation/railroad_diagram/index.md +0 -425
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "astn",
|
|
3
|
-
"version": "0.111.
|
|
3
|
+
"version": "0.111.21",
|
|
4
4
|
"description": "A TypeScript library for parsing and formatting ASTN (Abstract Syntax Tree Notation) - a human-editable data format for structured content",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"exupery-core-alg": "^0.1.12",
|
|
51
51
|
"exupery-core-bin": "^0.1.18",
|
|
52
|
-
"exupery-core-data": "^0.1.
|
|
53
|
-
"exupery-core-dev": "^0.1.
|
|
54
|
-
"pareto-fountain-pen": "^0.1.
|
|
55
|
-
"pareto-json": "^0.1.
|
|
56
|
-
"pareto-standard-operations": "^0.1.
|
|
52
|
+
"exupery-core-data": "^0.1.11",
|
|
53
|
+
"exupery-core-dev": "^0.1.3",
|
|
54
|
+
"pareto-fountain-pen": "^0.1.34",
|
|
55
|
+
"pareto-json": "^0.1.11",
|
|
56
|
+
"pareto-standard-operations": "^0.1.14"
|
|
57
57
|
}
|
|
58
58
|
}
|
package/LICENSE
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
Apache License
|
|
2
|
-
Version 2.0, January 2004
|
|
3
|
-
http://www.apache.org/licenses/
|
|
4
|
-
|
|
5
|
-
Copyright (c) 2025 Corno
|
|
6
|
-
|
|
7
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
you may not use this file except in compliance with the License.
|
|
9
|
-
You may obtain a copy of the License at
|
|
10
|
-
|
|
11
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
|
|
13
|
-
Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
See the License for the specific language governing permissions and
|
|
17
|
-
limitations under the License.
|
package/README.md
DELETED
|
@@ -1,525 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
<img src="./images/icon.png" alt="ASTN Logo" width="120" height="120"/>
|
|
3
|
-
|
|
4
|
-
# ASTN
|
|
5
|
-
### Abstract Syntax Tree Notation
|
|
6
|
-
|
|
7
|
-
[](https://www.npmjs.com/package/astn)
|
|
8
|
-
[](https://www.typescriptlang.org/)
|
|
9
|
-
[](LICENSE)
|
|
10
|
-
[](https://marketplace.visualstudio.com/items?itemName=astn)
|
|
11
|
-
|
|
12
|
-
**A human-editable data format that extends JSON with type awareness**
|
|
13
|
-
|
|
14
|
-
<br/>
|
|
15
|
-
|
|
16
|
-
<div align="center">
|
|
17
|
-
<table>
|
|
18
|
-
<tr>
|
|
19
|
-
<td align="center" style="border: 2px solid #0366d6; border-radius: 8px; padding: 16px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;">
|
|
20
|
-
<strong>💡 ASTN does for JSON what TypeScript does for JavaScript</strong>
|
|
21
|
-
</td>
|
|
22
|
-
</tr>
|
|
23
|
-
</table>
|
|
24
|
-
</div>
|
|
25
|
-
|
|
26
|
-
<br/>
|
|
27
|
-
|
|
28
|
-
*Enhanced readability • Rich data structures • Built-in formatting*
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## 📚 Table of Contents
|
|
34
|
-
|
|
35
|
-
- [✨ Features](#features)
|
|
36
|
-
- [🚀 Quick Start](#quick-start)
|
|
37
|
-
- [🆚 JSON vs ASTN Comparison](#json-vs-astn-comparison)
|
|
38
|
-
- [📖 ASTN Syntax Overview](#astn-syntax-overview)
|
|
39
|
-
- [🔧 VS Code Extension](#vs-code-extension)
|
|
40
|
-
- [⚡ CLI Usage](#cli-usage)
|
|
41
|
-
- [📚 Documentation](#documentation)
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
**ASTN is a superset of JSON** - any valid JSON document is also valid ASTN, but ASTN provides additional features for enhanced readability and functionality.
|
|
46
|
-
|
|
47
|
-
## ✨ Features
|
|
48
|
-
|
|
49
|
-
<table>
|
|
50
|
-
<tr>
|
|
51
|
-
<td width="50%">
|
|
52
|
-
|
|
53
|
-
### 📝 **Enhanced Syntax**
|
|
54
|
-
- 📋 **Multiple string types** - quoted, backticked, apostrophed, and undelimited
|
|
55
|
-
- 💬 **Comments** - Line and block comments throughout
|
|
56
|
-
- ✨ **Flexible punctuation** - Optional commas, trailing commas allowed
|
|
57
|
-
|
|
58
|
-
</td>
|
|
59
|
-
<td width="50%">
|
|
60
|
-
|
|
61
|
-
### 🏗️ **Rich Data Structures**
|
|
62
|
-
- 🗂️ **Dictionaries & Lists** - Clear instance vs schema distinction
|
|
63
|
-
- 🏷️ **Tagged values** - Type information embedded in data
|
|
64
|
-
- 📄 **Document headers** - Optional metadata for documents
|
|
65
|
-
|
|
66
|
-
</td>
|
|
67
|
-
</tr>
|
|
68
|
-
<tr>
|
|
69
|
-
<td width="50%">
|
|
70
|
-
|
|
71
|
-
### 🔗 **Advanced Features**
|
|
72
|
-
- � **File inclusion** - Import other files with `@` syntax
|
|
73
|
-
- ❓ **Optional values** - Explicit optional/not-set markers
|
|
74
|
-
- 🎯 **Groups** - Concise and verbose structured data
|
|
75
|
-
|
|
76
|
-
</td>
|
|
77
|
-
<td width="50%">
|
|
78
|
-
|
|
79
|
-
### 🚀 **Developer Experience**
|
|
80
|
-
- ⚡ **Fast parsing** - Efficient lexer and parser
|
|
81
|
-
- � **Rich validation** - Comprehensive error reporting
|
|
82
|
-
- 🎨 **Auto-formatting** - Built-in code formatter
|
|
83
|
-
|
|
84
|
-
</td>
|
|
85
|
-
</tr>
|
|
86
|
-
</table>
|
|
87
|
-
|
|
88
|
-
## 🚀 Quick Start
|
|
89
|
-
|
|
90
|
-
### 📝 For Authoring ASTN Files
|
|
91
|
-
|
|
92
|
-
Want to start writing ASTN files or create ASTN schemas? Get the best editing experience with VS Code:
|
|
93
|
-
|
|
94
|
-
1. **Install VS Code Extension**
|
|
95
|
-
- Search for "**astn**" in the VS Code Extensions marketplace
|
|
96
|
-
- Or install directly: `ext install astn`
|
|
97
|
-
|
|
98
|
-
2. **Create a new file** with `.astn` extension
|
|
99
|
-
|
|
100
|
-
3. **Create rich textual languages effortlessly** - Design expressive, domain-specific formats that read naturally and feel powerful, without needing to learn anything about parsing or language implementation. ASTN handles all the technical complexity while you focus on creating beautiful, meaningful syntax.
|
|
101
|
-
|
|
102
|
-
4. **Start writing!** Check out our [sample ASTN file](./sample_astn_file.astn) to see the syntax in action
|
|
103
|
-
|
|
104
|
-
5. **Features you'll get:**
|
|
105
|
-
- 🎨 Syntax highlighting
|
|
106
|
-
- 🔍 Real-time error detection
|
|
107
|
-
- 📝 IntelliSense and autocompletion
|
|
108
|
-
- 🔧 Automatic formatting
|
|
109
|
-
|
|
110
|
-
### 💻 For Software Development
|
|
111
|
-
|
|
112
|
-
Want to parse and work with ASTN files in your application?
|
|
113
|
-
|
|
114
|
-
#### Installation
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
npm install astn
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
#### Parsing ASTN
|
|
121
|
-
|
|
122
|
-
```typescript
|
|
123
|
-
import { Parser } from 'astn';
|
|
124
|
-
|
|
125
|
-
const source = `
|
|
126
|
-
! header "example"
|
|
127
|
-
{
|
|
128
|
-
\`name\`: "John Doe"
|
|
129
|
-
\`age\`: | 'number' "30"
|
|
130
|
-
\`hobbies\`: [
|
|
131
|
-
"reading"
|
|
132
|
-
"coding"
|
|
133
|
-
]
|
|
134
|
-
}
|
|
135
|
-
`;
|
|
136
|
-
|
|
137
|
-
const result = Parser.parse(source, { 'tab size': 4 });
|
|
138
|
-
|
|
139
|
-
if (result[0] === 'success') {
|
|
140
|
-
console.log('Parsed successfully:', result[1]);
|
|
141
|
-
} else {
|
|
142
|
-
console.error('Parse error:', result[1]);
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
#### Formatting ASTN
|
|
147
|
-
|
|
148
|
-
```typescript
|
|
149
|
-
import * as format from 'astn/format';
|
|
150
|
-
import * as types from 'astn';
|
|
151
|
-
|
|
152
|
-
// Format a parsed document
|
|
153
|
-
const edits = format.Document(document, {
|
|
154
|
-
'remove commas': false,
|
|
155
|
-
'indentation string': ' ',
|
|
156
|
-
'current indentation': ''
|
|
157
|
-
});
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
#### Error Handling
|
|
161
|
-
|
|
162
|
-
```typescript
|
|
163
|
-
import * as create_error_message from 'astn/create_error_message';
|
|
164
|
-
|
|
165
|
-
const result = Parser.parse(invalidSource, { 'tab size': 4 });
|
|
166
|
-
|
|
167
|
-
if (result[0] === 'failure') {
|
|
168
|
-
const errorMessage = create_error_message.Parse_Error(result[1], {
|
|
169
|
-
'position info': ['one based', null]
|
|
170
|
-
});
|
|
171
|
-
console.error('Parse Error:', errorMessage);
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
## ASTN Syntax Overview
|
|
176
|
-
|
|
177
|
-
ASTN supports various data types and structures:
|
|
178
|
-
|
|
179
|
-
### JSON Compatibility
|
|
180
|
-
|
|
181
|
-
Since ASTN is a superset of JSON, any valid JSON works as-is:
|
|
182
|
-
|
|
183
|
-
```json
|
|
184
|
-
{
|
|
185
|
-
"name": "John Doe",
|
|
186
|
-
"age": 30,
|
|
187
|
-
"hobbies": ["reading", "coding"],
|
|
188
|
-
"active": true,
|
|
189
|
-
"metadata": null
|
|
190
|
-
}
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
But ASTN extends JSON with additional features for better readability and functionality.
|
|
194
|
-
|
|
195
|
-
## 🆚 JSON vs ASTN Comparison
|
|
196
|
-
|
|
197
|
-
Here's the same data structure showing ASTN's enhanced features:
|
|
198
|
-
|
|
199
|
-
<table>
|
|
200
|
-
<tr>
|
|
201
|
-
<th>JSON</th>
|
|
202
|
-
<th>ASTN</th>
|
|
203
|
-
</tr>
|
|
204
|
-
<tr>
|
|
205
|
-
<td>
|
|
206
|
-
|
|
207
|
-
```json
|
|
208
|
-
{
|
|
209
|
-
"config": {
|
|
210
|
-
"name": "MyApp",
|
|
211
|
-
"version": "1.2.3",
|
|
212
|
-
"enabled": true,
|
|
213
|
-
"created": "2025-07-21T10:30:00Z",
|
|
214
|
-
"tags": ["web", "typescript"],
|
|
215
|
-
"databases": {
|
|
216
|
-
"local": {
|
|
217
|
-
"host": "localhost",
|
|
218
|
-
"port": 5432,
|
|
219
|
-
"ssl": null
|
|
220
|
-
},
|
|
221
|
-
"remote": {
|
|
222
|
-
"host": "localhost",
|
|
223
|
-
"port": 1234,
|
|
224
|
-
"ssl": null
|
|
225
|
-
},
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
</td>
|
|
232
|
-
<td>
|
|
233
|
-
|
|
234
|
-
```astn
|
|
235
|
-
! "Application Configuration"
|
|
236
|
-
(
|
|
237
|
-
'config': {
|
|
238
|
-
'name': "MyApp"
|
|
239
|
-
'version': "1.2.3"
|
|
240
|
-
'enabled': true
|
|
241
|
-
'created': 2025-07-21 // undelimited date
|
|
242
|
-
'tags': ["web", "typescript"]
|
|
243
|
-
'databases': (
|
|
244
|
-
`local`: {
|
|
245
|
-
'host': "localhost"
|
|
246
|
-
'port': | 'number' "5432" // tagged value
|
|
247
|
-
'ssl': ~ // not set
|
|
248
|
-
},
|
|
249
|
-
`remote": <"localhost" 'number' 1234 ~>
|
|
250
|
-
)
|
|
251
|
-
}
|
|
252
|
-
)
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
</td>
|
|
256
|
-
</tr>
|
|
257
|
-
</table>
|
|
258
|
-
|
|
259
|
-
**ASTN advantages shown above:**
|
|
260
|
-
- 📄 **Headers** - `! header "..."` for document metadata
|
|
261
|
-
- 💬 **Comments** - `//` and `/* */` supported throughout
|
|
262
|
-
- 🏷️ **Tagged values** - `| 'number' "5432"` for type information
|
|
263
|
-
- ✨ **Flexible literals** - `2025-07-21` without quotes
|
|
264
|
-
- 🚫 **Explicit "not set"** - `~` instead of `null`
|
|
265
|
-
- **Instance keys** - `` `key` `` for data identifiers
|
|
266
|
-
- ✨ **Optional commas** - cleaner syntax without mandatory commas
|
|
267
|
-
|
|
268
|
-
### Schema vs Instance Data Distinction
|
|
269
|
-
|
|
270
|
-
One of ASTN's key improvements over JSON is the clear distinction between **schema keys** (fixed structure) and **instance keys** (dynamic data):
|
|
271
|
-
|
|
272
|
-
**JSON Problem:** In JSON, it's difficult to distinguish between:
|
|
273
|
-
```json
|
|
274
|
-
{
|
|
275
|
-
"config": { // Is this a schema key or instance data?
|
|
276
|
-
"host": "localhost" // Are these fixed fields or dynamic entries?
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
**ASTN Solution:** Uses different structures for different purposes:
|
|
282
|
-
|
|
283
|
-
```astn
|
|
284
|
-
// Verbose Group - for schema/structure ( () and apostrophe keys)
|
|
285
|
-
('config': (
|
|
286
|
-
'host': "localhost" // Fixed schema fields
|
|
287
|
-
'port': 5432
|
|
288
|
-
))
|
|
289
|
-
|
|
290
|
-
// Dictionary - for instance/dynamic data ( {} and backtick keys)
|
|
291
|
-
{
|
|
292
|
-
`user_123`: "John" // Dynamic user IDs
|
|
293
|
-
`user_456`: "Jane" // Runtime-determined keys
|
|
294
|
-
}
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
This makes the data's intent much clearer to both humans and tools!
|
|
298
|
-
|
|
299
|
-
### Lists vs Concise Groups Distinction
|
|
300
|
-
|
|
301
|
-
ASTN also distinguishes between **lists** (ordered instance data) and **groups** (ordered schema data):
|
|
302
|
-
|
|
303
|
-
**JSON Problem:** Arrays in JSON are ambiguous about their purpose:
|
|
304
|
-
```json
|
|
305
|
-
{
|
|
306
|
-
"coordinates": [10, 20, 30], // Is this a list or structured data?
|
|
307
|
-
"users": ["John", "Jane"] // Dynamic list or fixed schema fields?
|
|
308
|
-
}
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**ASTN Solution:** Four different structures for different purposes:
|
|
312
|
-
|
|
313
|
-
```astn
|
|
314
|
-
// 1. List - for dynamic/instance data (square brackets)
|
|
315
|
-
{
|
|
316
|
-
`users`: [ // Dynamic list of users
|
|
317
|
-
"John"
|
|
318
|
-
"Jane"
|
|
319
|
-
"Bob" // Can add/remove items
|
|
320
|
-
]
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// 2. Dictionary - for key-value instance data (curly braces + backticks)
|
|
324
|
-
{
|
|
325
|
-
`user_data`: {
|
|
326
|
-
`user_123`: "John" // Dynamic user IDs as keys
|
|
327
|
-
`user_456`: "Jane" // Runtime-determined keys
|
|
328
|
-
`user_789`: "Bob"
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// 3. Concise Group - for schema/structure (angle brackets)
|
|
333
|
-
{
|
|
334
|
-
`coordinates`: <10 20 30> // Fixed x, y, z coordinates
|
|
335
|
-
`rgb_color`: <255 128 0> // Fixed red, green, blue values
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// 4. Verbose Group - explicit schema names (parentheses)
|
|
339
|
-
{
|
|
340
|
-
`coordinates`: (
|
|
341
|
-
'x': 10
|
|
342
|
-
'y': 20
|
|
343
|
-
'z': 30
|
|
344
|
-
)
|
|
345
|
-
}
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
**Example: Same data in concise vs verbose groups:**
|
|
349
|
-
```astn
|
|
350
|
-
// Concise - implicit positional names
|
|
351
|
-
`person`: <"John" 30 "Engineer">
|
|
352
|
-
|
|
353
|
-
// Verbose - explicit schema names (equivalent to above)
|
|
354
|
-
`person`: (
|
|
355
|
-
'name': "John"
|
|
356
|
-
'age': 30
|
|
357
|
-
'job': "Engineer"
|
|
358
|
-
)
|
|
359
|
-
```
|
|
360
|
-
schema-aware tooling can create support to toggle between these 2 representations
|
|
361
|
-
|
|
362
|
-
**Concise vs Verbose Groups:** These are interchangeable - concise groups are just verbose groups with implicit position-based schema names (first, second, third, etc.).
|
|
363
|
-
|
|
364
|
-
### Document Structure
|
|
365
|
-
```astn
|
|
366
|
-
// Optional header
|
|
367
|
-
! header "Document metadata or title"
|
|
368
|
-
|
|
369
|
-
// Main document content
|
|
370
|
-
{
|
|
371
|
-
"content": "value"
|
|
372
|
-
}
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
### Basic Values
|
|
376
|
-
```astn
|
|
377
|
-
"quoted string" // Can contain newlines and escape sequences
|
|
378
|
-
'apostrophed string' // Used for schema/meta names (keys, state names)
|
|
379
|
-
`backticked string` // Used for identifiers
|
|
380
|
-
undelimited_string // Flexible literals (dates, numbers, booleans, etc.)
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
**String Type Usage:**
|
|
384
|
-
- **Quoted strings** (`"..."`) - General purpose strings that support newlines and escape sequences like `\n`, `\t`, `\"`, etc.
|
|
385
|
-
- **Apostrophed strings** (`'...'`) - Specifically for schema and metadata names such as verbose group keys and tagged value state names
|
|
386
|
-
- **Backticked strings** (`` `...` ``) - Used for identifiers and instance data such as dictionary keys
|
|
387
|
-
- **Undelimited strings** - More flexible than JSON primitives; can represent:
|
|
388
|
-
- Booleans: `true`, `false`
|
|
389
|
-
- Numbers: `42`, `3.14`, `-123`
|
|
390
|
-
- Dates: `2025-07-21`, `2025-07-21T10:30:00Z`
|
|
391
|
-
- Custom literals: `null`, `undefined`, or domain-specific values
|
|
392
|
-
|
|
393
|
-
### Collections
|
|
394
|
-
```astn
|
|
395
|
-
// Dictionary (commas optional, trailing commas allowed)
|
|
396
|
-
{
|
|
397
|
-
`key`: "value" // backtick for instance data key
|
|
398
|
-
`number`: | 'number' "42" // backtick for key, apostrophe for state name
|
|
399
|
-
`description`: "Multi-line
|
|
400
|
-
strings are supported
|
|
401
|
-
in quoted strings"
|
|
402
|
-
`date`: 2025-07-21 // undelimited date
|
|
403
|
-
`enabled`: true // undelimited boolean
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// List with flexible comma usage
|
|
407
|
-
[
|
|
408
|
-
"item1"
|
|
409
|
-
'schema_name' // apostrophe for schema identifier
|
|
410
|
-
`instance_id` // backtick for instance identifier
|
|
411
|
-
2025-07-21 // undelimited date
|
|
412
|
-
42 // undelimited number
|
|
413
|
-
]
|
|
414
|
-
|
|
415
|
-
// Concise Group
|
|
416
|
-
<"item1" 'meta_name' `instance_id`>
|
|
417
|
-
|
|
418
|
-
// Verbose Group (apostrophes for schema keys)
|
|
419
|
-
('schema_key': "value1" 'another_key': "value2")
|
|
420
|
-
```
|
|
421
|
-
|
|
422
|
-
### Special Values
|
|
423
|
-
```astn
|
|
424
|
-
// Tagged values (apostrophe for state names)
|
|
425
|
-
| 'number' "42"
|
|
426
|
-
| 'date' 2025-07-21
|
|
427
|
-
| 'boolean' true
|
|
428
|
-
| 'custom_type' "some value"
|
|
429
|
-
|
|
430
|
-
// Optional values
|
|
431
|
-
* "optional value"
|
|
432
|
-
* 2025-12-31 // undelimited date as optional
|
|
433
|
-
|
|
434
|
-
// Not set
|
|
435
|
-
~
|
|
436
|
-
|
|
437
|
-
// File inclusion
|
|
438
|
-
@ "path/to/config.astn"
|
|
439
|
-
@ "../shared/constants.astn"
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
### Comments
|
|
443
|
-
```astn
|
|
444
|
-
// Line comment
|
|
445
|
-
/* Block comment */
|
|
446
|
-
{
|
|
447
|
-
"key": "value" // Trailing comment
|
|
448
|
-
}
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
## 🔧 VS Code Extension
|
|
452
|
-
|
|
453
|
-
<div align="center">
|
|
454
|
-
<img src="https://img.shields.io/badge/VS%20Code-Extension%20Available-blue?style=for-the-badge&logo=visualstudiocode" alt="VS Code Extension"/>
|
|
455
|
-
</div>
|
|
456
|
-
|
|
457
|
-
For the best development experience with ASTN files, install the **ASTN** VS Code extension:
|
|
458
|
-
|
|
459
|
-
- **Extension ID**: `astn`
|
|
460
|
-
- **Features**: Syntax highlighting, error detection, and formatting support
|
|
461
|
-
- **Installation**: Search for "astn" in the VS Code Extensions marketplace
|
|
462
|
-
|
|
463
|
-
### Extension Features:
|
|
464
|
-
- 🎨 **Syntax highlighting** for `.astn` files
|
|
465
|
-
- 🔍 **Real-time error detection** and validation
|
|
466
|
-
- 📝 **IntelliSense** and autocompletion
|
|
467
|
-
- 🔧 **Integrated formatting** support
|
|
468
|
-
|
|
469
|
-
## CLI Usage
|
|
470
|
-
|
|
471
|
-
Validate ASTN files:
|
|
472
|
-
|
|
473
|
-
```bash
|
|
474
|
-
npx astn-validate < input.astn
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
## API Reference
|
|
478
|
-
|
|
479
|
-
### Types
|
|
480
|
-
|
|
481
|
-
- `Document` - Root document structure
|
|
482
|
-
- `Value` - Any ASTN value
|
|
483
|
-
- `String` - String with type information
|
|
484
|
-
- `Parse_Error` - Detailed error information
|
|
485
|
-
- `Location` - Position information in source
|
|
486
|
-
|
|
487
|
-
### Functions
|
|
488
|
-
|
|
489
|
-
- `Parser.parse(source, options)` - Parse ASTN source
|
|
490
|
-
- `format.Document(doc, options)` - Format a document
|
|
491
|
-
- `create_error_message.Parse_Error(error, options)` - Create human-readable error messages
|
|
492
|
-
|
|
493
|
-
## 📚 Documentation
|
|
494
|
-
|
|
495
|
-
<div align="center">
|
|
496
|
-
|
|
497
|
-
| Resource | Description |
|
|
498
|
-
|----------|-------------|
|
|
499
|
-
| 🚂 [Railroad Diagrams](./documentation/railroad_diagram/index.md) | Visual syntax diagrams |
|
|
500
|
-
| 📝 [EBNF Grammar](./extra/astn.ebnf) | Formal grammar specification |
|
|
501
|
-
| 📋 [Sample File](./sample_astn_file.astn) | Example ASTN syntax |
|
|
502
|
-
|
|
503
|
-
</div>
|
|
504
|
-
|
|
505
|
-
---
|
|
506
|
-
|
|
507
|
-
<div align="center">
|
|
508
|
-
|
|
509
|
-
## 🤝 Contributing
|
|
510
|
-
|
|
511
|
-
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
512
|
-
|
|
513
|
-
## 📄 License
|
|
514
|
-
|
|
515
|
-
Apache 2.0 License - see [LICENSE](LICENSE) file for details.
|
|
516
|
-
|
|
517
|
-
## 📦 Version
|
|
518
|
-
|
|
519
|
-
Current version: **0.110.5**
|
|
520
|
-
|
|
521
|
-
---
|
|
522
|
-
|
|
523
|
-
<sub>Made with ❤️ for better data formats</sub>
|
|
524
|
-
|
|
525
|
-
</div>
|
package/dist/procedures/test.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.$$ = void 0;
|
|
27
|
-
const _ea = __importStar(require("exupery-core-alg"));
|
|
28
|
-
const _easync = __importStar(require("exupery-core-async"));
|
|
29
|
-
const log_error_1 = require("exupery-resources/dist/procedures/log_error");
|
|
30
|
-
const $$ = () => _easync.up.action(_easync.upi.u(() => {
|
|
31
|
-
return _easync.command.unguaranteed['raise exception'](null);
|
|
32
|
-
}, () => ({
|
|
33
|
-
'exit code': 0
|
|
34
|
-
}), _easync.eh(log_error_1.$$, ($) => ({
|
|
35
|
-
'lines': _ea.array_literal(["No tests yet"])
|
|
36
|
-
}))), _easync.uq.fixed(null));
|
|
37
|
-
exports.$$ = $$;
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9jZWR1cmVzL3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzREFBdUM7QUFFdkMsNERBQTZDO0FBRTdDLDJFQUErRTtBQUV4RSxNQUFNLEVBQUUsR0FBc0MsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNULEdBQUcsRUFBRTtJQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNoRSxDQUFDLEVBQ0QsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNILFdBQVcsRUFBRSxDQUFDO0NBQ2pCLENBQUMsRUFDRixPQUFPLENBQUMsRUFBRSxDQUNOLGNBQVcsRUFDWCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNKLE9BQU8sRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7Q0FDL0MsQ0FBQyxDQUNMLENBQ0osRUFDRCxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDekIsQ0FBQTtBQWhCWSxRQUFBLEVBQUUsTUFnQmQifQ==
|
package/dist/test.d.ts
DELETED
package/dist/test.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
-
if (k2 === undefined) k2 = k;
|
|
5
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
-
}
|
|
9
|
-
Object.defineProperty(o, k2, desc);
|
|
10
|
-
}) : (function(o, m, k, k2) {
|
|
11
|
-
if (k2 === undefined) k2 = k;
|
|
12
|
-
o[k2] = m[k];
|
|
13
|
-
}));
|
|
14
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
-
}) : function(o, v) {
|
|
17
|
-
o["default"] = v;
|
|
18
|
-
});
|
|
19
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
20
|
-
if (mod && mod.__esModule) return mod;
|
|
21
|
-
var result = {};
|
|
22
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
23
|
-
__setModuleDefault(result, mod);
|
|
24
|
-
return result;
|
|
25
|
-
};
|
|
26
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
-
const _eb = __importStar(require("exupery-core-bin"));
|
|
28
|
-
const test_1 = require("./procedures/test");
|
|
29
|
-
_eb.run_unguaranteed_main_procedure(test_1.$$);
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsc0RBQXVDO0FBRXZDLDRDQUFzQztBQUV0QyxHQUFHLENBQUMsK0JBQStCLENBQUMsU0FBRSxDQUFDLENBQUEifQ==
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,425 +0,0 @@
|
|
|
1
|
-
<div style="background-color: white; color: black; padding: 1em;">
|
|
2
|
-
|
|
3
|
-
**astn_document:**
|
|
4
|
-
|
|
5
|
-

|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
astn_document
|
|
9
|
-
::= ( '!' header )? content
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
**header:**
|
|
13
|
-
|
|
14
|
-

|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
header ::= value
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
referenced by:
|
|
21
|
-
|
|
22
|
-
* astn_document
|
|
23
|
-
|
|
24
|
-
**content:**
|
|
25
|
-
|
|
26
|
-

|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
content ::= value
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
referenced by:
|
|
33
|
-
|
|
34
|
-
* astn_document
|
|
35
|
-
|
|
36
|
-
**value:**
|
|
37
|
-
|
|
38
|
-

|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
value ::= concise_group
|
|
42
|
-
| dictionary
|
|
43
|
-
| include
|
|
44
|
-
| list
|
|
45
|
-
| '~'
|
|
46
|
-
| set_optional_value
|
|
47
|
-
| string
|
|
48
|
-
| tagged_value
|
|
49
|
-
| verbose_group
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
referenced by:
|
|
53
|
-
|
|
54
|
-
* content
|
|
55
|
-
* elements
|
|
56
|
-
* header
|
|
57
|
-
* include
|
|
58
|
-
* key_value_pairs
|
|
59
|
-
* set_optional_value
|
|
60
|
-
* tagged_value
|
|
61
|
-
|
|
62
|
-
**concise_group:**
|
|
63
|
-
|
|
64
|
-

|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
concise_group
|
|
68
|
-
::= '<' elements '>'
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
referenced by:
|
|
72
|
-
|
|
73
|
-
* value
|
|
74
|
-
|
|
75
|
-
**dictionary:**
|
|
76
|
-
|
|
77
|
-

|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
dictionary
|
|
81
|
-
::= '{' key_value_pairs '}'
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
referenced by:
|
|
85
|
-
|
|
86
|
-
* value
|
|
87
|
-
|
|
88
|
-
**include:**
|
|
89
|
-
|
|
90
|
-

|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
include ::= '@' value
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
referenced by:
|
|
97
|
-
|
|
98
|
-
* value
|
|
99
|
-
|
|
100
|
-
**list:**
|
|
101
|
-
|
|
102
|
-

|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
list ::= '[' elements ']'
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
referenced by:
|
|
109
|
-
|
|
110
|
-
* value
|
|
111
|
-
|
|
112
|
-
**set_optional_value:**
|
|
113
|
-
|
|
114
|
-

|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
set_optional_value
|
|
118
|
-
::= '*' value
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
referenced by:
|
|
122
|
-
|
|
123
|
-
* value
|
|
124
|
-
|
|
125
|
-
**string:**
|
|
126
|
-
|
|
127
|
-

|
|
128
|
-
|
|
129
|
-
```
|
|
130
|
-
string ::= quoted_string
|
|
131
|
-
| apostrophed_string
|
|
132
|
-
| backticked_string
|
|
133
|
-
| undelimited_string
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
referenced by:
|
|
137
|
-
|
|
138
|
-
* key_value_pairs
|
|
139
|
-
* tagged_value
|
|
140
|
-
* value
|
|
141
|
-
|
|
142
|
-
**tagged_value:**
|
|
143
|
-
|
|
144
|
-

|
|
145
|
-
|
|
146
|
-
```
|
|
147
|
-
tagged_value
|
|
148
|
-
::= '|' string value
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
referenced by:
|
|
152
|
-
|
|
153
|
-
* value
|
|
154
|
-
|
|
155
|
-
**verbose_group:**
|
|
156
|
-
|
|
157
|
-

|
|
158
|
-
|
|
159
|
-
```
|
|
160
|
-
verbose_group
|
|
161
|
-
::= '(' key_value_pairs ')'
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
referenced by:
|
|
165
|
-
|
|
166
|
-
* value
|
|
167
|
-
|
|
168
|
-
**elements:**
|
|
169
|
-
|
|
170
|
-

|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
elements ::= ( value ','? )*
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
referenced by:
|
|
177
|
-
|
|
178
|
-
* concise_group
|
|
179
|
-
* list
|
|
180
|
-
|
|
181
|
-
**key_value_pairs:**
|
|
182
|
-
|
|
183
|
-

|
|
184
|
-
|
|
185
|
-
```
|
|
186
|
-
key_value_pairs
|
|
187
|
-
::= ( string ( ':' value )? ','? )*
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
referenced by:
|
|
191
|
-
|
|
192
|
-
* dictionary
|
|
193
|
-
* verbose_group
|
|
194
|
-
|
|
195
|
-
**ignorable:**
|
|
196
|
-
|
|
197
|
-

|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
ignorable
|
|
201
|
-
::= whitespace
|
|
202
|
-
| comment
|
|
203
|
-
/* ws: definition */
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
**quoted_string:**
|
|
207
|
-
|
|
208
|
-

|
|
209
|
-
|
|
210
|
-
```
|
|
211
|
-
quoted_string
|
|
212
|
-
::= '"' ( string_content_character - '"' | newline_character )* '"'
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
referenced by:
|
|
216
|
-
|
|
217
|
-
* string
|
|
218
|
-
|
|
219
|
-
**apostrophed_string:**
|
|
220
|
-
|
|
221
|
-

|
|
222
|
-
|
|
223
|
-
```
|
|
224
|
-
apostrophed_string
|
|
225
|
-
::= "'" ( string_content_character - "'" )* "'"
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
referenced by:
|
|
229
|
-
|
|
230
|
-
* string
|
|
231
|
-
|
|
232
|
-
**backticked_string:**
|
|
233
|
-
|
|
234
|
-

|
|
235
|
-
|
|
236
|
-
```
|
|
237
|
-
backticked_string
|
|
238
|
-
::= '`' ( string_content_character - '`' )* '`'
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
referenced by:
|
|
242
|
-
|
|
243
|
-
* string
|
|
244
|
-
|
|
245
|
-
**undelimited_string:**
|
|
246
|
-
|
|
247
|
-

|
|
248
|
-
|
|
249
|
-
```
|
|
250
|
-
undelimited_string
|
|
251
|
-
::= ( normal_character - ( '{' | '}' | '<' | '>' '(' | ')' '[' | ']' | '!' | '*' | ',' | '~' | ':' | '@'
|
|
252
|
-
| '|' | "'" | '"' | '`' | '/' | ' ' | '\t' )? )*
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
referenced by:
|
|
256
|
-
|
|
257
|
-
* string
|
|
258
|
-
|
|
259
|
-
**string_content_character:**
|
|
260
|
-
|
|
261
|
-

|
|
262
|
-
|
|
263
|
-
```
|
|
264
|
-
string_content_character
|
|
265
|
-
::= normal_character
|
|
266
|
-
| escaped_character
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
referenced by:
|
|
270
|
-
|
|
271
|
-
* apostrophed_string
|
|
272
|
-
* backticked_string
|
|
273
|
-
* quoted_string
|
|
274
|
-
|
|
275
|
-
**normal_character:**
|
|
276
|
-
|
|
277
|
-

|
|
278
|
-
|
|
279
|
-
```
|
|
280
|
-
normal_character
|
|
281
|
-
::= [#x20-#xD7FF#xE000-#xFFFD#x10000-#x10FFFF]?
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
referenced by:
|
|
285
|
-
|
|
286
|
-
* line_comment
|
|
287
|
-
* normal_or_newline_character
|
|
288
|
-
* string_content_character
|
|
289
|
-
* undelimited_string
|
|
290
|
-
|
|
291
|
-
**escaped_character:**
|
|
292
|
-
|
|
293
|
-

|
|
294
|
-
|
|
295
|
-
```
|
|
296
|
-
escaped_character
|
|
297
|
-
::= '\"'
|
|
298
|
-
| '\`'
|
|
299
|
-
| "\'"
|
|
300
|
-
| '\\'
|
|
301
|
-
| '\/'
|
|
302
|
-
| '\b'
|
|
303
|
-
| '\f'
|
|
304
|
-
| '\n'
|
|
305
|
-
| '\r'
|
|
306
|
-
| '\t'
|
|
307
|
-
| '\u' four_hexadecimal_digits
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
referenced by:
|
|
311
|
-
|
|
312
|
-
* string_content_character
|
|
313
|
-
|
|
314
|
-
**newline_character:**
|
|
315
|
-
|
|
316
|
-

|
|
317
|
-
|
|
318
|
-
```
|
|
319
|
-
newline_character
|
|
320
|
-
::= [#xA#xD]
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
referenced by:
|
|
324
|
-
|
|
325
|
-
* normal_or_newline_character
|
|
326
|
-
* quoted_string
|
|
327
|
-
|
|
328
|
-
**normal_or_newline_character:**
|
|
329
|
-
|
|
330
|
-

|
|
331
|
-
|
|
332
|
-
```
|
|
333
|
-
normal_or_newline_character
|
|
334
|
-
::= normal_character
|
|
335
|
-
| newline_character
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
referenced by:
|
|
339
|
-
|
|
340
|
-
* traditional_comment
|
|
341
|
-
|
|
342
|
-
**comment:**
|
|
343
|
-
|
|
344
|
-

|
|
345
|
-
|
|
346
|
-
```
|
|
347
|
-
comment ::= traditional_comment
|
|
348
|
-
| line_comment
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
referenced by:
|
|
352
|
-
|
|
353
|
-
* ignorable
|
|
354
|
-
|
|
355
|
-
**traditional_comment:**
|
|
356
|
-
|
|
357
|
-

|
|
358
|
-
|
|
359
|
-
```
|
|
360
|
-
traditional_comment
|
|
361
|
-
::= '/*' ( normal_or_newline_character* - ( normal_or_newline_character* '*/' normal_or_newline_character* ) ) '*/'
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
referenced by:
|
|
365
|
-
|
|
366
|
-
* comment
|
|
367
|
-
|
|
368
|
-
**line_comment:**
|
|
369
|
-
|
|
370
|
-

|
|
371
|
-
|
|
372
|
-
```
|
|
373
|
-
line_comment
|
|
374
|
-
::= '//' normal_character*
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
referenced by:
|
|
378
|
-
|
|
379
|
-
* comment
|
|
380
|
-
|
|
381
|
-
**four_hexadecimal_digits:**
|
|
382
|
-
|
|
383
|
-

|
|
384
|
-
|
|
385
|
-
```
|
|
386
|
-
four_hexadecimal_digits
|
|
387
|
-
::= hexadecimal_digit hexadecimal_digit hexadecimal_digit hexadecimal_digit
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
referenced by:
|
|
391
|
-
|
|
392
|
-
* escaped_character
|
|
393
|
-
|
|
394
|
-
**hexadecimal_digit:**
|
|
395
|
-
|
|
396
|
-

|
|
397
|
-
|
|
398
|
-
```
|
|
399
|
-
hexadecimal_digit
|
|
400
|
-
::= [0-9A-Fa-f]
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
referenced by:
|
|
404
|
-
|
|
405
|
-
* four_hexadecimal_digits
|
|
406
|
-
|
|
407
|
-
**whitespace:**
|
|
408
|
-
|
|
409
|
-

|
|
410
|
-
|
|
411
|
-
```
|
|
412
|
-
whitespace
|
|
413
|
-
::= [#x9#xA#xD#x20]+
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
referenced by:
|
|
417
|
-
|
|
418
|
-
* ignorable
|
|
419
|
-
|
|
420
|
-
##
|
|
421
|
-
 <sup>generated by [RR - Railroad Diagram Generator][RR]</sup>
|
|
422
|
-
|
|
423
|
-
[RR]: https://www.bottlecaps.de/rr/ui
|
|
424
|
-
|
|
425
|
-
</div>
|