本文へ移動
Hikari 仕様

std:hikari — Hikari ソースの解析

取得: import hikari := "std:hikari"

Hikari ソース文字列を処理系と同じ規則で解析し、結果をデータとして返す純計算
モジュール。処理系の内部表現(トークン列・AST)は公開しない。分類ロジックは
処理系と単一情報源であり、本モジュールはその読み出し口である。外部リソースには
触れない。

本モジュールは効果を1 つも持たない../language-spec.md §17.9)。

1. highlight

form: highlight(src){ String | List({ start: Int, end: Int, kind: String |}) }

src の意味分類スパンの List を返す。

  • スパンは { start: Int, end: Int, kind: String |}[start, end)src
    バイトオフセット(Hikari ソースは ASCII 限定 — language-spec.md §1.2 — のため
    桁と一致する)。
  • 不変条件: start < end・スパンは重ならない・start 昇順・改行をまたがない。
    区間外のバイトは無分類(既定表示)。
  • 層の約束: 字句層(comment / string / number / bool)は常に付く。意味層
    (識別子の slot / local / inner / builtin / type)は src 全体がパース成功した
    ときだけ上書きされる。パースはまず文の列として、通らなければ単独の型式として
    試す — { List(e) | Array(e) } のようなシグネチャの綴りは文としては読めない(スロット
    リストに List(e) は置けない)が型としては正しいので、型名が type になる。
    どちらでも読めなければ字句層だけが残る。同一入力に対して決定的。
  • 表示への写像(色・CSS クラス・ANSI コード)は利用側の関心事。本モジュールは
    分類だけを返す。
  • 分類の正確さ(どの識別子がどの kind になるか)はベストエフォートで、処理系の
    改良により変わりうる。契約はスパン構造の不変条件と kind の語彙である。

2. kind の語彙

kind 意味
comment 行コメント # ...
string 文字列リテラル
number 数値リテラル
bool true / false
keyword 予約語=構文形(import / type / match / inner 等。§1.4
slot slot 宣言・メンバー参照名
local body 内で導入されたローカルの宣言・参照
inner 内部名(inner-name)の宣言・参照
builtin prelude 常在名
type 型語彙(Int / List / ユーザー定義型名 等)

語彙は将来追加されうる。利用側は未知の kind を無分類と同様に素通しすること。

3. エラー

src が String 以外なら呼び出し位置のエラー(panic 系)。回復可能な失敗は無く、
Result は返さない。

4. 公開しないもの

トークン列・AST・診断結果は公開しない。