ソートと演算の宣言の組を指標 (signature) と呼ぶ。指標は well-formed な項の集合を定義する。例えば、次の 3つはモジュール NAT+ で宣言された指標において well-formed な項である:
0s(s(0))s(s(s(0))) + s(s(s(s(0))))次の二つは well-formed な項ではない:
s(s(0)) 0s(s(s(0))) * s(s(0))well-formed な項は、解析木 (parse tree) を持つ。コマンド parse は項 <term> の構文を解析する:
parse <term> .
構文解析の例:
自然数の仕様で宣言したモジュール NAT+ を使って、項 s(s(0)) + s(s(s(0))) を構文解析する。
最初に、select コマンドを使って、モジュール NAT+ を選択する:
CafeOBJ> select NAT+ NAT+>
parse コマンドを使って項 s(s(0)) + s(s(s(0))) を構文解析する:
The prompt has been changed into the current selected module. Parse s(s(0)) + s(s(s(0))) by using the parse command as follows:
NAT+> parse s(s(0)) + s(s(s(0))) . (s(s(0)) + s(s(s(0)))) : Nat NAT+>
parse コマンドで解析した結果、s(s(0)) + s(s(s(0))) はソート Nat 上の項であることがわかる。
ある項が複数の構文木を持つとき、その項は曖昧であると呼ぶ。例えば、項 s(0) + s(s(0)) + s(s(s(0))) は曖昧な項の例である。このような項を入力すると parse コマンドは警告を出す:
NAT+> parse s(0) + s(s(0)) + s(s(s(0))) . [Warning]: Ambiguous term: * Please select a term from the followings: [1] _+_ : Nat Nat -> Nat ---------------------((s(0) + s(s(0))) + s(s(s(0)))) [2] _+_ : Nat Nat -> Nat ---------------------(s(0) + (s(s(0)) + s(s(s(0))))) * Please input your choice (a number from 1 to 2, default is 1)? 1 Taking the first as correct. ((s(0) + s(s(0))) + s(s(s(0)))) : Nat NAT+>
この項は 2つの構文木 (1 + 2) + 3 と 1 + (2 + 3) を持つので、CafeOBJ 処理系はユーザにどちらの解釈を取るべきか尋ねてくる。ここでは前者の解釈を正しいとするために、1 を入力している。本来は、このような曖昧さが現れないよう、あらかじめ括弧を付けるなど、注意深く項を入力する必要がある。
parse コマンドに構文解析木を表示させるには、verbose スイッチを on にする。
verbose スイッチを on にするには、set コマンドを用いる:
NAT+> set verbose on NAT+>
verbose スイッチを on にすると、parse コマンドは解析木を表示する:
NAT+> parse (s(0) + s(s(0))) + s(s(s(0))) .
((s(0) + s(s(0))) + s(s(s(0)))) : Nat
_+_:Nat
/ \
_+_:Nat s:Nat
/ \ |
s:Nat s:Nat s:Nat
| | |
0:Nat s:Nat s:Nat
| |
0:Nat 0:Nat
NAT+> モジュールの選択を解除するには、次のようにタイプする:
NAT+> select . CafeOBJ>
Original Copyright © Takahiro Seino, all rights reserved.