1. sym_num

    No comment

    sym_num
Changes in body
Source | HTML | Preview
@@ -1,115 +1,116 @@
#はじめに
自作O-Prologにコンパイラ制作用の述語を追加しました。そのことについて書き留めました。ver1.62より入ります。
#ピリオドがうれしくないとき
Prologにはreadという述語があります。これはPrologの構文規則に従った入力を受け取り、引数にunifyするものです。
```prolog
| ?- read(X).
1+a*2=3.
X = 1+a*2=3
yes
|
```
Prologと類似の構文規則をもった言語処理系を作るときには、このreadがパースまでやってくれますのでとても楽ができます。しかし、入力の最後は必ずピリオドでないといけません。
ところで、最近のモダンな言語処理系は最後にピリオドなど終端を与えない設計になっているものが多いです。例えばRubyです。
```ruby
class Numeric
def plus(x)
self.+(x)
end
end
```
自分で言語処理系を設計し、実装してみるのは楽しいですし、勉強にもなります。しかし、一からC言語などで作るととても手間と時間がかかります。Prologはunifyがあるのでコンパイラ制作にも向いています。モダンなタイプの言語処理系を実装するのに役に立ちそうな述語を拡張しました。
#read_item
述語やリストなどをひとまとまりとして読み込み、引数にunifyします。Prologの構文要素に従い、部分品をおおまかに取り出してくるイメージです。
```prolog
| ?- read_item(X).
sin(2)
X = sin(2)
yes
| ?- read_item(X).
1.0e3
X = 1000.0
yes
| ?- read_item(X).
[a,b,c]
X = [a,b,c]
yes
```
read_item/1 とread_item/2があります。/1は標準入力から読み込みます。/2は第一引数にストリームを与え、第二引数に読み込んだ構文要素をunifyします。
, (コンマ) ;(セミコロン) のように演算子としての機能をもっているものは単純なアトムに変換して扱い易いようにしています。
#read_token
read_itemではリストなどがPrologの構文規則に従っていました。リストを {1,2,3} のように設計したい場合にはこれではうまくいきません。そこで、tokenの単位で切り取ってくるのがread_itemです。
```prolog
| ?- read_token(X).
[
X = '['
yes
| ?- read_token(X).
{
X = '{'
yes
| ?- read_token(X).
sin(2)
X = sin
yes
```
演算子は既登録済みのもの、ユーザーが定義したものに従ってトークンを切り出しています。ですから、設計した言語で *** というものをトークンとしたい場合には opを使って演算子として定義してください。
```prolog
O-Prolog Ver 1.62(Chika)
| ?- op(200,xfx,'***').
yes
| ?- read_token(X).
***1
X = '***'
yes
```
. (ピリオド)はトーケンとして切り出します。
-```
+```prolog
+
O-Prolog Ver 1.62(Chika)
| ?- read_token(X).
.
X = '.'
yes
```
read_token/1 とread_token/2があります。/1は標準入力から読み込みます。/2は第一引数にストリームを与え、第二引数に読み込んだ構文要素をunifyします。
, (コンマ) ;(セミコロン) のように演算子としての機能をもっているものなど、すべては単純アトムとしてunifyします。ですから、Prologの構文規則には左右されません。これらのトークンとunifyするときには、 ',' ';' のように単純なアトムとして考えてください。
#終わりに
上記の機能を使って自分で構文木を作り、Prologに変換するなり、C言語に変換するなりする方法をとれば、インスタントにコンパイラが作れると思います。これにより設計した言語がうまく機能するのかを確かめるプロとタイプとして使えるのではないかと思います.