見出し画像

[cocoa][swift]作譜用言語PL/0 構文に対する分析子の作成

有名な『Algorithms + Data Structures = Programs』の後半を独立して誕生した『COMPILERBAU:』を翻訳した『翻訳系構成法序論』を今の電子計算機環境で取り組んでみた。

使用するプログラミング言語Swiftを選択したのだが、コンパイラの実装には少々向いていない部分があるので、まずは、一文字読み込んで処理するサンプルを記述してみた。

import Foundation
let parser = Parser()
import Foundation
class Parser {
   var ch: Character = "\0"
   var lineString: String = ""
   
   init() {
       readChar()
       S()
   }
   
   func readChar() {
       lineString = readLine()!
       ch = lineString[lineString.index(lineString.startIndex, offsetBy:0)]
       lineString = String(lineString.suffix(lineString.count - 1))
   }
   
   /*
    開式記号に対応する手続き。
    */
   func S() {
   }
}

それでは、教科書のサンプルコードを記述してみよう。

以下の約束事があるとする。

A="x"|"("B")".
B=AC.
C={"+"A}.

これは以下のようになる。

x
(x)
(x+x)
((x))
((x+(x+x)))

これを実装してみると以下となる。

/* 分析子 */
class Parser {
   var ch: Character = "\0"
   var lineString: String = ""
   
   init() {
       print("\(#function)")
       readChar()
       A()
   }
   
   func A() {
       //print("\(#function)")
       if ch == "x" {
           readChar()
       }
       else if ch == "(" {
           readChar()
           A()
           while ch == "+" {
               readChar()
               A()
           }
           if ch == ")" {
               readChar()
           }
           else {
               error()
           }
       }
       else {
           error()
       }
   }
   func readChar() {
       if lineString.count <= 0 {
           lineString = readLine()!
       }
       ch = lineString[lineString.index(lineString.startIndex, offsetBy:0)]
       lineString = String(lineString.suffix(lineString.count - 1))
       print(ch)
   }
   
   func error() {
       print("error: \(#function)")
       exit(-1)
   }
}

ここまでは、約束事を愚直にコードで処理しているという感じだ。

ソースコード
GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/pl0 - GitHub<br />

【関連情報】
- Cocoa.swift 2019-02
Cocoa.swift
Cocoa勉強会 関東
MOSA
Cocoa練習帳
Qiita

この記事が気に入ったらサポートをしてみませんか?