最近、自作の構文解析用言語のParserScriptが使いづらくなってきた……。
ということで、UCCScript(Universal Compiler Creation Script Language(であってほしい))の開発を始めました。
開発段階のUCCScript:UCCScript-UnderDevelopment
現状今できること
GitHubにコードが何を表すかを詳しく解説します。
現在、ほとんどの機能が実装され、制御機能をつけています。具体的に書くと、任意のアンカーへの移動(Pattern:'
(アンカー)、m"p:index"
、m"r:index"
Result:'
(アンカー)、MoveP[index]
、MoveR[index]
)、BeMatch文(アンカーを使用して再マッチングを行わせる)、グローバル変数とGlobalLoad文を実装する予定です。
--追記
・現在、m"p:index"
、m"r:index"
(Pattern内)とMoveP[index]
、MoveR[index]
(Result内)を実装し、ret
(Pattern内)、Ret
(Result内)を実装しており、問題がないか確認する予定です。
・'
は基本スルーされますが、スルーせずにj
に飛ぶj
を実装することにしました。
--追記の追記
・MoveRの動作テストを行った際、プログラムが一向に終わらないバグが発生し、同様にm"p:index"
も終わらなくなり、原因不明のため、m"r:index"
改めm(index)
(またはM(index)
(()
は見ずらいのでわかりやすくしています))、MoveP[index]
改めMove[index]
のみとします。
・全ての機能を実装しました。UCCScript
使うことのできる制御機能はIf文、For文、ForB文、While文です(For文はRustやF#、ForB文はCやC#と機能は同じ)。また、変数のためのLoad文があります。
サンプル
以下は、a
とb
のみで構成された入力の内、a
を国語辞典
、b
を饗宴
に置き換えるコード
First Sample End
$Sample In { <{ ( "a" | "b" ) }> }
Is (For[0 $0+[0] 1 - 1][ (If[@1[0 `] "a" =][ "国語辞典" ] ElseIf[@1[0 `] "b" =][ "饗宴" ] Else[]) ]) End
First Sample End
$Sample In { <{ ( "a" | "b" ) }> }
Is (ForB[0 1][` $0+[0] <][ (If[@1[0 `] "a" =][ "国語辞典" ] ElseIf[@1[0 `] "b" =][ "饗宴" ] Else[]) ]) End
後者は条件を繰り返す度、再計算するので前者の方が良い
以下は二つの正の整数の入力Number1
とNumber2
を受け取り、Number1
を何倍すればNumber2
で割り切れるかを出力する
入力
Number1
Number2
コード
First Sample End
$Sample In <( Number )> "\n" <( Number )>
Is (Load Num1[@0[0] Num ~]) (Load Num2[@0[1] Num ~]) (Load Count[1])
(While[\Num1 \Count * \Num2 % 0 = !][ (Load Count[\Count 1 +]) ]) \Count End
現在発生中のバグ
現在、対応に追われているバグは以下の
First Test End
$Test In { <o "+-"> ( "+" | "-" ) <o "*/"> ( "*" | "/" ) }
Is (If[?[0] ?[1] &][ (For[0 $0+[0] 1 - 1][ @1[0 `] ]) (For[0 $0+[1] 1 - 1][ @1[1 `] ]) ] Else[]) End
というコードを書き、
+*-/
という入力を与えると
+-*/
という結果が返ってきてほしいのですが
+-+*/
という結果が返ってきます。
--追記
・このバグはUCCScriptの仕様によるもので、解決のしようがないものでした。
終わりに
ほかにもバグがあると思います。実装予定のものはあくまで、高速化などを目的にしているため、開発途中の(予定のものを除けば、完成した)ものを公開しています。使うときは、必ずREADMEを読んでください 。