jsonpiler 0.10.2

a Json syntax programming language for Windows
Documentation
# JSPL 言語仕様

## 概要

この言語は、JSON をベースとした構造に、構文糖と関数呼び出しや識別子による拡張を加えた形式です。
トップレベルで `{}` に囲まれていないブロック形式 (`JSPL`) の構文も許容されます。

## トップレベルの構文

- 通常の JSON 形式 (`parse_json`) に加えて、より柔軟な構文 (`parse_block`) をサポート
- JSPL 構文では、トップレベルで `{}` を省略可能
- 変数呼び出しや識別子に関数風の構文 `(arg1, arg2)` を組み合わせることができる

---

## 構文詳細

### 値(value)

任意の値は以下のいずれか:

- 文字列:`"abc"`
- 数値:`123`, `-10`, `1.23`, `2e5`
- ブール値:`true`, `false`
- null:`null`
- 配列:`[ val1, val2, ... ]`
- オブジェクト:`{ "key": value, ... }`
- 特殊構文:

  - 識別子:`someIdent``"someIdent"`
  - 識別子関数:`someFunc(arg1, arg2)``{ "someFunc": [ arg1, arg2 ] }`
  - プレーン識別子:`$name``{ "$": "name" }`
  - 値のペア:`val1 ident val2``{ ident: [ val1, val2 ] }`

---

## 数値(number)

- 数値は整数か浮動小数点数
- 負号 `-` を先頭に付けることができる
- `+`**許容されない**
- 整数部の先頭に `0` が付くのは **禁止**(例:`0123` → エラー)
- 浮動小数点形式 `123.45` や指数形式 `1.23e+10` をサポート

  - `e` または `E` に続く `+/-` と数字の並びが必須

### 数値の構文(BNF)

```text
number ::= '-'? int ('.' [0-9]+)? ([eE] [+-]? [0-9]+)?
int    ::= '0' | [1-9][0-9]*
```

---

## 識別子(identifier)

- `!``~`(0x21〜0x7E)の ASCII 印字可能文字のうち、以下を除く記号が使用可能:

  - `(`, `)`, `[`, `]`, `{`, `}`, `,`, `"`, `:`, `;`

- 次の語は **予約語として識別子に使用不可**
  - `true`, `false`, `null`
  - `$` で始まる名前(例:`$name`)は予約された意味を持つ

---

内部的には Str の省略表現として扱われる。

## 文字列(string)

- 二重引用符 `"..."` で囲まれた UTF-8 文字列
- バックスラッシュによるエスケープ文字をサポート:

| シーケンス | 意味                                          |
| ---------- | --------------------------------------------- |
| `\"`       | ダブルクオート                                |
| `\\`       | バックスラッシュ                              |
| `\/`       | スラッシュ                                    |
| `\b`       | バックスペース                                |
| `\f`       | フォームフィード                              |
| `\n`       | 改行                                          |
| `\r`       | 復帰                                          |
| `\t`       | タブ                                          |
| `\uXXXX`   | 16 進ユニコードコードポイント(UTF-8 へ変換) |

- 改行や制御文字は未エスケープでは **許容されない**

---

## 配列(array)

```json
["item1", 42, { "key": "value" }]
```

- `[]` で囲まれた値の列
- 値の区切りに `,` を使用
- 空配列 `[]` も許容される

---

## オブジェクト(object)

```jspl
key1(value1)
key2(42)
```

```jspl
{ key1: value1, key2: 42 }
```

- キーは文字列または識別子でなければならない。
- 空のオブジェクト`{}`は関数列として評価される場合は基本的に許容されない。

---

## JSPL 拡張構文

### トップレベルブロックの `{}` 省略

```jspl
key: "value"
list: [1, 2, 3]
```

→ JSON 相当:

```json
{ "key": "value", "list": [1, 2, 3] }
```

## オブジェクト内1行中に複数の要素

```jspl
key1: "value"; key2: 42
```

→

```json
{ "key1": "value", "key2": 42 }
```

### 中置記法 (どの関数にも適用可能)

```jspl
1 + 20 + 300
```

→

```json
{ "+": [1, 20, 300] }
```

### 識別子関数構文

```jspl
sum(1, 2, 3)
```

→

```json
{ "sum": [1, 2, 3] }
```

```jspl
abs: -1
```

→

```json
{ "abs": -1 }
```

### `$name` 記法

```jspl
$name;
```

→

```json
{ "$": "name" }
```

---

### コメント

```jspl
# comment
```

## エラールール(Parser)

- 不正な文字列エスケープ
- 制御文字を含む`Str`
- `0` で始まる複数桁の`Int`
- `.` の後に数字がない`Float`
- `e`/`E` の後に指数部がない`Float`
- `Object`のキーが`Str`以外
- 不正なトップレベル入力の残存

---