Help us understand the problem. What is going on with this article?

Prologでインスタントコンパイラ

More than 1 year has passed since last update.

はじめに

自作O-Prologにコンパイラ制作用の述語を追加しました。そのことについて書き留めました。ver1.62より入ります。

ピリオドがうれしくないとき

Prologにはreadという述語があります。これはPrologの構文規則に従った入力を受け取り、引数にunifyするものです。

| ?- read(X).
1+a*2=3.
X = 1+a*2=3
yes
|

Prologと類似の構文規則をもった言語処理系を作るときには、このreadがパースまでやってくれますのでとても楽ができます。しかし、入力の最後は必ずピリオドでないといけません。

ところで、最近のモダンな言語処理系は最後にピリオドなど終端を与えない設計になっているものが多いです。例えばRubyです。

class Numeric
  def plus(x)
    self.+(x)
  end
end

自分で言語処理系を設計し、実装してみるのは楽しいですし、勉強にもなります。しかし、一からC言語などで作るととても手間と時間がかかります。Prologはunifyがあるのでコンパイラ制作にも向いています。モダンなタイプの言語処理系を実装するのに役に立ちそうな述語を拡張しました。

read_item

述語やリストなどをひとまとまりとして読み込み、引数にunifyします。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_tokenです。

| ?- read_token(X).
[
X = '['
yes
| ?- read_token(X).
{

X = '{'
yes
| ?- read_token(X).
sin(2)
X = sin
yes

演算子は既登録済みのもの、ユーザーが定義したものに従ってトークンを切り出しています。ですから、設計した言語で *** というものをトークンとしたい場合には opを使って演算子として定義してください。

O-Prolog Ver 1.62(Chika)

| ?- op(200,xfx,'***').
yes
| ?- read_token(X).
***1
X = '***'
yes

. (ピリオド)はトークンとして切り出します。

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言語に変換するなりする方法をとれば、インスタントにコンパイラが作れると思います。これにより設計した言語がうまく機能するのかを確かめるプロトタイプとして使えるのではないかと思います.

sym_num
LALの笹川です。よろしくお願いします。
http://eisl.kan-be.com/
fukuokaex
エンジニア/企業向けにElixirプロダクト開発・SI案件開発を支援する福岡のコミュニティ
https://fukuokaex.fun/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away