Xenon DSL Syntax Highlighter
VSCode向けXenon言語のシンタックスハイライト拡張機能です。.xenonファイルの構文を色分けして表示します。
機能
この拡張機能は以下の機能を提供します:
.xenonファイルの構文ハイライト
- キーワード、コメント、文字列、数値などの色分け表示
- コードの可読性向上
サポートされている構文要素
- キーワード:
type, enum, interface, class, functionなど
- データ型:
string, number, boolean, any, void
- コメント:
# で始まる行コメント
- 文字列: 一重引用符(
')と二重引用符(")で囲まれた文字列
- 数値: 整数と小数
- アノテーション:
@で始まる識別子
- 演算子: 代入演算子(
=, :=, -=など)
インストール方法
VSIXからのインストール
- このリポジトリからVSIX拡張機能パッケージをダウンロード
- VSCodeを開き、拡張機能ビュー(Ctrl+Shift+X)を表示
- 拡張機能ビューの「...」メニューから「VSIXからのインストール...」を選択
- ダウンロードしたVSIXファイルを選択してインストール
開発環境からのインストール
- このリポジトリをクローン
npm installを実行して依存関係をインストール
npm run compileでコンパイル
- F5キーを押して拡張機能をデバッグモードで実行
🧬 Xenon DSL 仕様書 ver 0.5.0
概要
Xenon は、関数呼び出し風の記法を用いて構造化データを簡潔に定義するDSLです。
# を用いたセクションラベルでリストを定義します。
📥 インポート
他のXenonファイルをインポートする機能を提供します。
ファイルは相対パスまたは絶対パスで指定します。
%import("path/to/file.xenon")
- インポート文はファイルの先頭に記述する必要があります
- 複数のインポートを行う場合は複数行に記述します
- インポートしたファイルの型定義や値をそのまま利用できます
- 循環参照は避けてください(A→B→Aのような参照関係)
// 複数ファイルのインポート例
%import("common/types.xenon")
%import("common/constants.xenon")
// インポートした型を使用
User(name: "Alice", role: Admin)
🏷 キーワード(予約語)
以下の語は識別子として使用できません:
deftype, defenum, defunion, list, map, true, false, null
💬 コメント
// コメントです
deftype User(name: string)
ブロックコメント
/* /
/* /
/* /
/* ****/
- 連続する*の個数が一致する必要があります。
- コメントはプリプロセッサーで処理されるため、pegjsでは処理する必要はありません。
🔤 型定義
列挙型(Enum)
defenum Role = Admin | User | Guest
- 列挙値は縦書きや区切り文字(
|)で区切ることができます
共用型(Union)
defunion Item = Text | Image | Audio
- 共用型も列挙型と同様に縦書きや区切り文字で表現可能です
通常型(Type)
deftype User(name: string, age: int?)
? を付けることで nullable 型
- デフォルト値の指定も可能:
deftype User(name: string = "anonymous", age: int = 0)
deftype User(
id: int,
name: string = "unnamed",
role: Role = User
)
🧩 型システム
プリミティブ型
int, float, bool, string, binary, DateTime, Timestamp
Nullable型
ジェネリック型
list<int> - リスト型
map<string, string> - マップ型(キーと値の型を指定)
deftype Request(
url: string,
method: string = "GET",
headers: map<string, string> = {}
)
🏷 セクションラベル構文
セクション記法(#)でリストを定義
# Users
User(name: "Alice", age: 30)
User(name: "Bob", age: 25)
## Admins
User(name: "Carol", age: 40)
#, ##, ### による階層を表現可能
- セクションの中は宣言のリスト
- セクションはネストでき、パスとして参照可能(例:
Users.Admins)
セクション階層例
# Definitions
Info(name: "xenon", version: "0.1.0")
## Members
User(id: 1, name: "Alice")
User(id: 2, name: "Bob", role: Admin)
## Plugins
Plugin(name: "PluginA", version: "1.0.0")
- この例では
Definitions セクションの下に Members と Plugins サブセクションがあります
🧾 リテラル
整数 / 浮動小数点数
42
0xdeadbeef
3.1415
真偽値 / Null
true
false
null
文字列リテラル
"abc" // 二重引用符
'abc' // 単一引用符
"""
複数行の
テキスト
""" // 三重二重引用符(複数行)
'''
複数行の
テキスト
''' // 三重単一引用符(複数行)
日時型リテラル
// DateTime型 - ISO8601形式の日時文字列
DateTime("2025-05-17T12:34:56+09:00")
// Timestamp型 - UNIXタイムスタンプ(浮動小数点数)
Timestamp(1715958000.0)
- DateTime型はISO8601形式の文字列を使用して日時を表現します
- Timestamp型はUNIXエポック(1970年1月1日UTC)からの経過秒数を浮動小数点数で表現します
バイナリリテラル
バイナリデータは << と >> で囲まれたデータで表現します。複数の異なるエンコーディングのデータを混在させることができます。
// 基本的なバイナリリテラル
<<1, 2, 3, 4, 5>> // 数値の配列
// 混合エンコーディングのバイナリリテラル
<<
1, 2, 3, // 数値(バイト)
"UTF8文字列", // UTF-8文字列
"0123ABCDEF"/hex, // 16進数エンコーディング
"BASE32DATA"/base32, // Base32エンコーディング
"BASE64DATA"/base64 // Base64エンコーディング
>>
- サポートされるエンコーディング形式:
/utf8 または指定なし - UTF-8文字列(デフォルト)
/hex - 16進数エンコード
/base32 - Base32エンコード
/base64 - Base64エンコード
- 整数値は0-255の範囲の単一バイト値として扱われます
- バイナリデータは複数行で記述可能で、カンマで区切ります
- 各要素の前後の空白は無視されます
リスト / マップ
[1, 2, 3]
{
"key": "value",
"count": 42
}
[
"item1",
"item2"
]
{
"Content-Type": "application/json",
"Authorization": "Bearer TOKEN"
}
✨ 複数行表現
全ての要素は複数行で記述可能です:
deftype Plugin(
name: string,
version: string,
depends: list<string> = []
)
User(
id: 2,
name: "Bob",
role: Admin
)
✨ 位置パラメーター
値を宣言する際に、パラメーター名を省略して位置のみで引数を指定できます:
// 型定義
deftype Point(x: int, y: int)
deftype DateTime(datetime: string, timezone: string = "UTC")
// 名前付きパラメーター
Point(x: 10, y: 20)
DateTime(datetime: "2025-05-17T12:34:56+09:00", timezone: "Tokyo/Japan")
// 位置パラメーター
Point(10, 20)
DateTime("2025-05-17T12:34:56+09:00")
// 位置パラメーターと名前付きパラメーターの混在
DateTime("2025-05-17T12:34:56+09:00", timezone: "Tokyo/Japan")
- 位置パラメーターは型定義で宣言されたフィールドの順序に従います
- 位置パラメーターと名前付きパラメーターを混在させる場合、位置パラメーターが先、名前付きパラメーターが後に来る必要があります
- 位置パラメーターで指定したフィールドを名前付きパラメーターで再度指定することはできません
- 位置パラメーターを使用する場合、必須フィールドへの値の指定は必須です
- 位置パラメーターはオプションのフィールドを飛ばすことができません(順序通りに指定する必要があります)
✨ アノテーション
deftype User(
@id id: int,
@range(0, 150) age: int = 30
)
使用例:
@id, @range, @default, @readonly, @deprecated("理由") など
✅ 文法の特徴
| 項目 |
内容 |
| 宣言 |
TypeName(key: value, ...) |
| 階層表現 |
セクションラベルで可能 |
| AST変換 |
容易(JSON・Prolog・YAMLなど) |
| インデント制御 |
不要(@@INDENT@@などは廃止) |
| パーサー構築 |
PEG.js / peggy / Ohm-js に最適化 |
例:完全な定義
defenum Role = Admin | User
deftype Info(
name: string,
version: string,
metas: map<string, string> = {}
)
deftype User(
id: int,
name: string = "unnamed",
role: Role = User
)
deftype BinaryData(
name: string,
data: binary = <<1, 2, 3>>
)
deftype LogEntry(
id: int,
message: string,
created: DateTime,
received: Timestamp
)
# Definitions
Info(name: "xenon", version: "0.1.0", metas: {
"description": "Xenon is a tool for building and managing plugins.",
"author": "John Doe",
"license": "MIT"
})
## Members
User(id: 1, name: "Alice")
User(
id: 2,
name: "Bob",
role: Admin
)
## Binary Examples
BinaryData(
name: "mixed",
data: <<
1, 2, 3,
"文字列データ",
"0123456789ABCDEF"/hex,
"BASE64ENCODED"/base64
>>
)
# Logs
LogEntry(
id: 1,
message: "起動",
created: DateTime("2025-05-17T12:34:56+09:00"),
received: Timestamp(1715958000.0)
)