penframe
Version:
A lightweight DSL-based wireframe and UI structure visualization tool.
97 lines (77 loc) • 2.35 kB
Markdown
# PEG.js Grammar Implementation
## Overview
PEG.jsを使用して、ペンフレームのDSLをパースするための文法を実装しています。
## 文法の基本構造
### 現在の実装
現在は最も基本的な数値のパースのみを実装しています:
```pegjs
{
// パース結果をそのまま返す
function parseNumber(digits) {
return parseInt(digits.join(""), 10);
}
}
Start
= Number
Number
= digits:[0-9]+ {
return parseNumber(digits);
}
```
### 文法の説明
1. **初期化ブロック**
- `{ ... }` で囲まれた部分は、パーサーの初期化時に実行されるJavaScriptコードです
- 現在は `parseNumber` 関数を定義しており、数字の配列を整数に変換します
2. **Start ルール**
- パーサーの開始点となるルールです
- 現在は `Number` ルールを呼び出します
3. **Number ルール**
- `[0-9]+` は1つ以上の数字にマッチします
- `digits:` はマッチした数字の配列を `digits` という変数に格納します
- `{ ... }` 内のコードは、マッチが成功した時に実行されます
## 今後の拡張予定
1. **アプリケーション定義の追加**
```pegjs
App = "@app" _ device:Device _ "{" _ props:Properties _ "}"
```
2. **プロパティのサポート**
```pegjs
Properties = head:Property tail:(_ Property)*
Property = key:Identifier _ ":" _ value:Value
```
3. **値の型の追加**
- 数値(整数、小数)
- 文字列
- 真偽値
- 配列
- オブジェクト
## 使用例
### 現在の実装
```typescript
// 入力: "123"
// 出力: 123 (number)
```
### 将来の実装
```typescript
// 入力:
@app pc {
width: 1440
height: 1024
scale: 0.5
title: "Sample Wireframe"
}
// 出力:
{
type: "app",
device: "pc",
width: 1440,
height: 1024,
scale: 0.5,
title: "Sample Wireframe"
}
```
## 注意点
- PEG.jsの文法は、上から下に向かって評価されます
- 各ルールは最初にマッチしたパターンを使用します
- 空白や改行の処理には特別な注意が必要です
### PEG.js 自体は「ファイル分割」の仕組みをサポートしていません。