Skip to content

feat: Token 機能拡張 (Kind/IsInserted/派生型) の LightGlr 対応 + テスト - #26

Merged
actbit merged 7 commits into
masterfrom
docs/onaccepted-usage
Jul 13, 2026
Merged

feat: Token 機能拡張 (Kind/IsInserted/派生型) の LightGlr 対応 + テスト#26
actbit merged 7 commits into
masterfrom
docs/onaccepted-usage

Conversation

@actbit

@actbit actbit commented Jul 13, 2026

Copy link
Copy Markdown
Owner

概要

Token 機能拡張 (Kind / IsInserted / 派生型引き継ぎ) の LightGlr モード対応と、テスト追加。

背景

最近の3コミット (43adef5 IsInserted、382e41c Kind、9652b2c 派生型引き継ぎ) で Token 機能拡張を実装したが、2つの問題があった:

  1. LightGlr モード (GlrParserEmitter) が未対応 — LALR 用 ParserEmitter のみ更新され、LightGlr では Kind が常に null、派生型の引き継ぎも Text のみ。ドキュメントはモードを限定せず「Text + Kind + IsInserted を引き継ぐ」と書いており不整合。
  2. ParserEmitterhasKinds スコープバグEmitHelpershasKinds を参照するがスコープ外 (CS0103) で Generator がビルド不可。9652b2c の「全352テスト合格」はコード確定前の古い実行結果だった。

変更内容

実装 (src/)

  • GlrParserEmitter.cs: LALR (ParserEmitter) と対称化
    • __tokenKinds 配列生成 + __ToToken で Kind 設定
    • __ct_<型> ヘルパー生成 (派生型の Kind/IsInserted 引き継ぎ)
    • reduce 時の派生型生成を new <型>(...Text) から __ct_<型>(src) 呼出しに変更
  • ParserEmitter.cs: hasKinds スコープバグ修正 (パラメータ化) + __ct_ 生成コードの見栄え改善

テスト (tests/)

  • TokenFeature/ (新規): 派生型 NumberToken で LALR+LightGlr 両モードの Kind/IsInserted/派生型引き継ぎを検証。LALR/LightGlr を別名前空間に分離 (ModelExtraction が [Grammar] と同名前空間の AstNode 派生を収集するため)
  • GlrTests.cs: IsInserted_OnOperator_LightGlr 追加 (入力 "1 2" → ER1 の + 挿入を GlrAdd.Op.IsInserted で観測)
  • GlrAmbiguousGrammar.cs: Kind="number" で Kind 検証
  • ParserEmitterTests.cs: stubs 更新 (NotifyAccepted, Kind, IsInserted, LexToken 参照) — Step 0 のビルド復旧で顕在化した潜在バグ

ドキュメント

  • grammar-reference.md (ja/en): Kind/IsInserted/派生型のプロパティ表と使用例を記載

検証

359 テスト合格 (AstFirst.Tests 306 + Generator.Tests 53)。

🤖 Generated with Claude Code

actbit and others added 7 commits July 13, 2026 07:32
OnAccepted コールバックのドキュメント:
- タイミング (LALR: reduce直後 / LightGlr: fork収束時)
- OnReduce との違い (読み取り専用 vs 書き込み可)
- コード例 (宣言の追加)
- いつ使うべきかのガイド

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ダミートークンの Span が default(SourceSpan) = (0,0) だったため、
エラー回復で挿入されたトークンを含むノードの Span 自動計算で
(0,0) が混ざる問題を修正。

前後トークンの位置から補間:
- Start = 前トークンの End (位置・行・列)
- End = 次トークンの Start (位置・行・列)
- EOF 時は前トークンの End
- ゼロ幅スパン (Start == End) も許可

全 352 テスト合格。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ja/en の grammar-reference.md:
旧: 「挿入トークンは値 null」(NullReferenceException 警告)
新: 「挿入トークンは空文字 + 推測 Span」(前後トークンから補間)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Token 基底クラスに IsInserted プロパティ (internal set) を追加。
ErrorRepair が挿入するダミートークンに IsInserted = true を設定。

ユーザーは OnReduce/OnAccepted で挿入トークンを判定可能:
  if (Num.IsInserted) return;  // 挿入トークン: スキップ

全 352 テスト合格。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
[Token]/[Pattern] に Kind プロパティを追加。指定した文字列が
Token.Kind に設定される。

使い方:
  [Token(@"[0-9]+", Kind = "number")] Token num
  [Token(@"if", Kind = "keyword", Priority = 1)] Token kw

生成コード:
  - __tokenKinds 配列 (TokenId → Kind)
  - ToToken で __tok.Kind = __tokenKinds[t.TokenId]

Token.IsInserted に加え、Token.Kind でトークンの属性判定が可能。

全 352 テスト合格。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Token 基底クラスに Kind (public get/set) と IsInserted (public get/set) を追加。
Token 派生型 (NumberToken 等) を reduce 時に再構築する際、
Text だけでなく Kind と IsInserted も引き継ぐよう生成コードを修正。

生成ヘルパー (型ごとに __ct_TypeName メソッドを生成):
  private static NumberToken __ct_NumberToken(Token src)
  {
      var t = new NumberToken(src.Text);
      t.Kind = src.Kind;
      t.IsInserted = src.IsInserted;
      return t;
  }

全 352 テスト合格。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LightGlr モード (GlrParserEmitter) が Token 機能拡張に未対応だったのを LALR と対称化:
- __tokenKinds 配列生成 + __ToToken で Kind 設定
- __ct_<型> ヘルパー生成 (派生型の Kind/IsInserted 引き継ぎ)
- reduce 時の派生型生成を __ct_ 呼出しに変更

ParserEmitter の hasKinds スコープバグ (CS0103 で Generator がビルド不可) を修正。
9652b2c の時点で壊れており「352テスト合格」は古い状態だった。

テスト追加:
- TokenFeature/ (派生型 NumberToken、LALR+LightGlr 両モードで Kind/IsInserted/派生型引き継ぎを検証)
- GlrTests に IsInserted_OnOperator_LightGlr 追加 (入力 "1 2" → ER1 の + 挿入を観測)
- GlrAmbiguousGrammar/GlrTests に Kind 検証

Generator.Tests の stubs を更新 (NotifyAccepted, Kind, IsInserted, LexToken 参照)。
Step 0 のビルド復旧で顕在化した潜在バグ。

全 359 テスト合格 (AstFirst.Tests 306 + Generator.Tests 53)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@actbit
actbit merged commit 80c1a7a into master Jul 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant