1. sym_num

    Posted

    sym_num
Changes in title
+Prologでインスタントコンパイラ
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,100 @@
+#はじめに
+自作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).
+| ?- 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に変換するなり、C言語に変換するなりする方法をとれば、インスタントにコンパイラが作れると思います。これにより設計した言語がうまく機能するのかを確かめるプロとタイプとして使えるのではないかと思います.
+