lean-ja / lean-by-example

コード例で学ぶ Lean 言語
https://lean-ja.github.io/lean-by-example/
MIT License
51 stars 7 forks source link

構文カテゴリが「それですべて」であることをどうやって知るのか #1115

Open Seasawher opened 1 week ago

Seasawher commented 1 week ago

aesop の phase や builder_name が「それですべて」であることを保証したい

declare_syntax_cat hoge_cat

syntax "hoge" : hoge_cat
syntax "fuga" : hoge_cat
syntax "foo" : hoge_cat

Zulip: > how to enumerate all syntax of given sytanx category

Seasawher commented 1 week ago

syntax category は拡張可能なので、全列挙することはできない。(「これですべて」という情報がない) また TSyntax は正当性をチェックしないので、固定された構文でも全列挙は保証できない。

何が入っているのかを列挙することは一応できる。

declare_syntax_cat hoge_cat

syntax "hoge" : hoge_cat
syntax "fuga" : hoge_cat
syntax "foo" : hoge_cat

open Lean

def matchHogeCat : TSyntax `hoge_cat → Unit
  | `(hoge_cat| hoge) => ()
  | `(hoge_cat| fuga) => ()
  | `(hoge_cat| foo) => ()
  | _ => () -- why this line is needed? Without this line, the match is said not to be exhaustive.
Seasawher commented 1 week ago

構文カテゴリを使うからだめ。<|> を使うべき。

syntax hoge := "hoge" <|> "fuga" <|> "foo"