Posted at

[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

【関連情報】

Cocoa.swift 2019-02


Cocoa.swift


Cocoa勉強会 関東


MOSA


Cocoa練習帳


Qiita