# 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]+)?
---
## 識別子(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`以外
- 不正なトップレベル入力の残存
---