予期しない結果を返すバグがありますが、現在調査中です。
ダウンロードはせず、UCCScript.cs
というファイルの内容を別ファイルにコピーするだけです。
First (GrammarName) End
・・・ 実行するとき、最初にGrammarName
を呼び出す
$(GrammarName) In (Pattern) Is (Result) End
・・・ Pattern
に文法のパターン、Result
に結果を返す処理を書く
<( pat )>
・・・ pat
をResult
で参照可能にする(以後、普通参照と呼ぶ)
<{ pat }>
・・・ pat
をResult
で配列で参照可能にする(以後、配列参照と呼ぶ)
< GrammarName >
・・・ GrammarName
を呼び出す
<o "chars">
・・・ パースする文字列がchars
のうちのどれかで始まっていなければ、強制的にResult
へ移る
<x "chars">
・・・ パースする文字列がchars
のうちのどれかで始まっていれば、強制的にResult
へ移る
<s "chars">
・・・ パースする文字列がchars
のうちのどれかで始まることがなくなるまでの文字列とマッチ
<ns "chars">
・・・ パースする文字列がchars
のうちのどれかで始まっていることがなくなるまでの文字列とマッチ
<"char"
・・・ パースする文字列を先頭からchar
でトリミングする
( pat1 | pat2 )
・・・ pat1
かpat2
にマッチ
{ pat }
・・・ pat
に0回以上マッチ
[ pat ]
・・・ pat
に0または1回マッチ
"string"
・・・ string
にマッチ
Number
・・・ 10進数字にマッチ
Char
・・・ 任意の文字にマッチ
String
・・・ "
、'
、空白、10進数字以外にマッチ
演算はスタックで行う
@0[index]
・・・ 参照可能にしたもののうち、index
番目の文字列をスタックにプッシュする(普通参照用)
@1[index1 index2]
・・・ 参照可能にしたもののうち、index1
番目のindex2
番目の文字列をスタックにプッシュする(配列参照用)
$0[index]
・・・ 参照可能にしたもののうち、index
番目の文字列の長さをスタックにプッシュする(普通参照用)
$0+[index]
・・・ 参照可能にしたもののうち、index
番目の配列の長さをスタックにプッシュする(配列参照用)
$1[index1 index2]
・・・ 参照可能にしたもののうち、index1
番目のindex2
番目の文字列の長さをプッシュする(配列参照用)
?[index]
・・・ 参照可能にしたもののうち、index
番目が存在したらTrue
、しなかったらFalse
をスタックにプッシュする
"string"
・・・ スタックにstring
をプッシュする
l
・・・ スタックからポップし、その長さをスタックにプッシュする
#
・・・ スタックからポップし、その型をスタックにプッシュする(値は@num
、文字列は@str
、真偽値は@bool
をプッシュ)
Num
・・・ スタックに@num
をプッシュ
Str
・・・ スタックに@str
をプッシュ
Bool
・・・ スタックに@bool
をプッシュ
True
・・・ スタックにTrue
をプッシュ
False
・・・ スタックにFalse
をプッシュ
10進数字 ・・・ スタックにその10進数字をプッシュ
+
・・・ 加算
-
・・・ 減算
*
・・・ 乗算
/
・・・ 除算
%
・・・ 剰余算
^
・・・ べき乗
=
・・・ 等価演算子
!
・・・ 真偽値の反転
<
・・・ 小なり
>
・・・ 大なり
&
・・・ 論理積
|
・・・ 論理和
~
・・・ 型変換
:
・・・ スタックの最後をプッシュ(Befungeの:
と同じ)
(制御構文)
・・・ 見たまんま
Result
の中では条件分岐や繰り返しなどが使えます。
書き方:If[Condition1][Result1]ElseIf[Condition2][Result2]ElseIf[Condition3][Result3] ... Else[Result4]
(ElseIf
はなくてもよいです。)
書き方:For[First Last Increase][Result]
RustやF#のfor
と同じかんじです(増加量を設定できるところは違うかも)。
書き方:ForB[First Increase][Condition][Result]
CとかDとかのfor
と同じかんじです(Condition
が外にあるのは実装の都合なので、許してください)。
書き方:While[Condition][Result]
ほかのプログラミング言語と同じように書けます。
書き方:Load VarName[Value]
変数宣言や変数へ値を代入できます。値型だけです。変数の値を取得するときは、\VarName
と書きます。
ちなみに、構文の途中で演算を行うことができます。