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・診断結果は公開しない。