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)
)