# 1991/11/23 Ver. P. 1.0 # 以下で%は、0〜100の自然数であり、かつそれぞれの確率を表す。 # # 通常パラグラフ # @P Paragraph_No. % # # 複数回出現パラグラフ # @P Paragraph_No. xdy x,y共に、適当な自然数。 # ゲームでのダイスの表記法と同じ # # Radioパラグラフ # @P Paragraph_No. R 全RadioParagraph_No. % # 全RadioParagraph_No.は複数指定可 # # 依存パラグラフ1 # @P ParagraphNo. D 依存先Paragraph_No. % # 全RadioParagraph_No.は複数指定可 # # 1991/11/25 Ver. P. 1.1 # Dの場合、その後にRの形で選択できるようにした。 # @P ParagraphNo. D 依存先Paragraph_No. R 全RadioParagraph_No. % # 全RadioParagraph_No.は複数指定可 # # 1991/11/26 Ver. P. 1.2 # NDの追加 # 依存パラグラフ2 # @P ParagraphNo. ND 依存先Paragraph_No. % # @P ParagraphNo. ND 依存先Paragraph_No. R 全RadioParagraph_No. % # 全RadioParagraph_No.は複数指定可 # # plot.SAGの出力に、パラグラフ宣言行(@Pから始まっている行)も # 出力するように変更 # # 不要センテンスをメモリに残さないように変更 # # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ # ★ ★ # ★ 1991/11/26 ★ # ★ PROT.AWK Ver. P. 1.x 終了 ★ # ★ ★ # ★ 制作者 小林 聡 ★ # ★ ★ # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ # # 1991/11/27 Ver. P. 2.0 作成開始 # 1991/11/28 Ver. P. 2.0 # percent,times,radio の組み込み # 1991/12/1 Ver. P. 2.0 # radio文の処理をブロックに対応。書式は # radio #1 name#1 #2 name#2 #3 name#3 ..... # 各#nはname#nの確率 # 又は、 # radio # { # #1 name#1 or sentence#1 # #2 name#2 or sentence#2 # #3 name#3 or sentence#3 # ..... # ..... # } # 各#nはname#nあるいはsentence#nの確率 # のいずれかのみ。 # # percent,times,radio の関数化 # # 変数(%螂の制御を完全にした。(Ver. P. 1.xと同様になるようにした) # # Exist文,NotExist文を付加 # # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ # ★ ★ # ★ 1991/12/1 ★ # ★ PROT.AWK Ver. P. 2.0 完成 ★ # ★ ★ # ★ 制作者 小林 聡 ★ # ★ ★ # ★ Ver. P. 1.2 と同等の機能+α付加完了 ★ # ★ ★ # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ # # # プログラム動作前(awkプログラム、ロード直後) # ディスク USER は 1990-7-5 15:28 に作成されました. # 655360 バイト : 全メモリ # 316704 バイト : 使用可能メモリ # # プログラム終了前 # ディスク USER は 1990-7-5 15:28 に作成されました. # 655360 バイト : 全メモリ # 301344 バイト : 使用可能メモリ # # '91 12 3 Ver. P. 2.1 # set, resetの付加 # set %variable ttt で%variableにtttをセット。 # reset %variable で%variableをリセット。 # 入力ファイル名をプログラム中で指定する方法を止めた。ファイル名の指定方法は、SCENA2.batを参照 # # '91 12 7 Ver. P. 3.0 # Prot3.awk 制作開始 # ', >>, percent, set, reset コマンドの作成 # # '91 12 7 Ver. P. 3.0 # times,exist,notexistコマンドの作成 # # '91 12 12 Ver. P. 3.0 # radio,ClrVarコマンドの作成 # # '91 12 15 Ver. P. 3.1 # ClrVar BugFix # ifset, ifnotsetコマンドの作成 # # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ # ★ ★ # ★ 1991/12/15 ★ # ★ PROT.AWK Ver. P. 3.1 完成 ★ # ★ ★ # ★ 制作者 小林 聡 ★ # ★ ★ # ★ Ver. P. 2.0 と同等の機能+α付加完了 ★ # ★ ★ # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ # # '93 4 11 Ver. P. 3.2 # radioコマンド内で、ブロックを使用できるようにした。 # これによって、次のような文もちゃんと評価できる。 # # radio { # 50 { # ‥‥ # } # 50 { # ‥‥ # } # } # # '93 4 14 # KeyInコマンド設定。書式は以下の通り。 # keyin 変数名 # この変数名は、plot.awk、word.awkの書式に従う事。 # # '93 6 15 # CaseコマンドをScena2よりコピー # setコマンドの、変数連結機能追加 # nullコマンドの追加 # # '93 7 3 # プログラムの基本的な構造をScena2.awkと同じにした。(Bug有り得る) # Ver. P. 4.0 に変更。 # # '95 8 25 # resetコマンドのバグを直した (複数の引数に対応していなかった) # percentコマンドのバグを直した(%に失敗したときの{}の処理をしていなかった) BEGIN { print "PLOT.AWK Ver. P. 4.0" > "/dev/stderr" IGNORECASE = 1; spaces = "   "; srand(); ReadParaData(); # plot.DICのParagraphへの読みこみ CPN = 1; # CurrentParagraphName CPL = 2; # CurrentParagraphLineNumber CPT = 3; # CurrebtParagraphTimes SP = 0; # StackPointer dum[1] = ">>"; dum[2] = "main"; Call(dum); print "プロットの作成が終了しました。" > "/dev/stderr" } # -=-=- -=-=- MainRoutin -=-=- END -=-=- -=-=- -=-=- function Parser(SplitedLine ,returnvalue) { if (SplitedLine[1] ~ /^'$/) { OutPut(SplitedLine); } else if (SplitedLine[1] ~ /^>>$/) { Call(SplitedLine); } else if (SplitedLine[1] ~ /^percent$/) { # percent文の処理 Percent(SplitedLine); } else if (SplitedLine[1] ~ /^times$/) { # times文の処理 Times(SplitedLine); } else if (SplitedLine[1] ~ /^radio$/) { # radio文の処理 Radio(SplitedLine); } else if (SplitedLine[1] ~ /^exist$/) { # exist文の処理 exist(SplitedLine); } else if (SplitedLine[1] ~ /^notexist$/) { # notexist文の処理 notexist(SplitedLine); } else if (SplitedLine[1] ~ /^set$/) { set(SplitedLine); } else if (SplitedLine[1] ~ /^reset$/) { reset(SplitedLine); } else if (SplitedLine[1] ~ /^ifset$/) { IfSet(SplitedLine); } else if (SplitedLine[1] ~ /^ifnotset$/) { IfNotSet(SplitedLine); } else if (SplitedLine[1] ~ /^case$/) { Case(SplitedLine); } else if (SplitedLine[1] ~ /^clrvar$/) { ClrVar(SplitedLine); } else if (SplitedLine[1] ~ /^keyin$/) { KeyIn(SplitedLine); } else if (SplitedLine[1] ~ /^nul$/) { nul(SplitedLine); } } # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- function set(SplitedLine, i,s,x) { s = var[SplitedLine[2]]; for(i = 3; SplitedLine[i] != ""; i++) { if (SplitedLine[i] ~ /^%/) { if (var[SplitedLine[i]] ~ "^[" spaces "]+%") { x = var[SplitedLine[i]]; while(x ~ "^[" spaces "]+%") { y = x; x = var[x]; } if(x == "") { s = s " " y " "; } else { s = s " " x " "; } # s = s " " SplitedLine[i] " "; } else if (var[SplitedLine[i]] != "") { s = s " " var[SplitedLine[i]] " "; } else { s = s " " SplitedLine[i] " "; } } else { s = s " " SplitedLine[i] " "; } } gsub(" "," ",s); var[SplitedLine[2]] = s; } ########## # 次のラインに設定する。 function NextLine() { stack[SP,CPL]++; if (Paragraph[stack[SP,CPN],0] < stack[SP,CPL]) { ERROR(1,stack[SP,CPN]); } else { return Paragraph[stack[SP,CPN],stack[SP,CPL]]; } } function nul(SplitedLine, i) { print "NowIn NUL>:" SplitedLine[2] " " SplitedLine[3] for(i = 2; SplitedLine[i] != ""; i++) { if (SplitedLine[i] ~ "^%[^" spaces "]+$") { var[SplitedLine[i]] = "nul"; } } } function reset(SplitedLine, i) { for(i = 2; SplitedLine[i] != ""; i++) { # var[SplitedLine[2]] = ""; var[SplitedLine[i]] = ""; } } function KeyIn(SplitedLine ,i,flag) { printf("\n指定キーを入力して下さい>"); do { flag = 0; i = KeyInEnt(); if (i > SplitedLine[3]+0) { printf("\n入力ミスです。もう一度入力してください。>"); flag = 1; } } while(flag) var[SplitedLine[2]] = i ""; return 0; } ########## # keyin コマンドの実体 function KeyInEnt( i) { getline i < "/dev/stdin"; return i+0; } function IfSet(SplitedLine, i,CurrentLine,paren) { if (var[SplitedLine[2]] ~ " " SplitedLine[3] " ") { CurrentLine = "" if (SplitedLine[4] ~ /{/) { paren = SplitedLine[4]; gsub("{","",paren); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren) { sub("^[" spaces "]*","",CurrentLine) split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } else { for(i = 4; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i]; } split(CurrentLine,SplitedLine) Parser(SplitedLine) } } else { if (SplitedLine[4] ~ /{/) { paren = SplitedLine[4]; gsub("{","",paren); while (Paragraph[stack[SP,CPN],stack[SP,CPL]] !~ "}" paren) { stack[SP,CPL]++; } } } } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- function IfNotSet(SplitedLine, i,CurrentLine,paren) { if (var[SplitedLine[2]] !~ " " SplitedLine[3] " " ||\ var[SplitedLine[2]] == "") { CurrentLine = "" if (SplitedLine[4] ~ /{/) { paren = SplitedLine[4]; gsub("{","",paren); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren) { sub("^[" spaces "]*","",CurrentLine) split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } else { for(i = 4; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i]; } split(CurrentLine,SplitedLine) Parser(SplitedLine) } } else { if (SplitedLine[4] ~ /{/) { paren = SplitedLine[4]; gsub("{","",paren); while (Paragraph[stack[SP,CPN],stack[SP,CPL]] !~ "}" paren) { stack[SP,CPL]++; } } } } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- function Case(SplitedLine, i,objvar,paren1,paren2) { CurrentLine = ""; if (SplitedLine[3] ~ /{/) { objvar = SplitedLine[2]; paren1 = SplitedLine[3]; gsub("{","",paren1); NestLevel = 1; OldNestLevel = 1; while (CurrentLine !~ "}" paren1){ CurrentLine = NextLine(); split(CurrentLine,SplitedLine) if (var[objvar] ~ " " SplitedLine[1] " " || \ SplitedLine[1] ~ /^else$/) { CurrentLine = "" for (i = 2; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i]; } if (CurrentLine !~ /{/) { split(CurrentLine,SplitedLine); Parser(SplitedLine); } else { split(CurrentLine,SplitedLine); paren2 = SplitedLine[1]; gsub("{","",paren2); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren2){ split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } while (CurrentLine !~ "}" paren1) { CurrentLine = NextLine(); } } } } else { ERROR(2,"case"); } } function VarAna(CurrentLine, SplitedLine , i) { if (CurrentLine !~ /^.*((if|ifnot|re)?set|case|clrvar).*$/) { split(CurrentLine, SplitedLine); for(i = 1; SplitedLine[i] != ""; i++) { if (SplitedLine[i] ~ "^%[^" spaces "]+(\.[0-9a-zA-Z]+)?$") { varhist[SplitedLine[i]]++ } } for(i = 1; SplitedLine[i] != ""; i++) { if (var[SplitedLine[i]] == "nul") { gsub(SplitedLine[i],"",CurrentLine); } else if (var[SplitedLine[i]] != "") { gsub(SplitedLine[i],var[SplitedLine[i]],CurrentLine); gsub(" +"," ",CurrentLine); } } } return CurrentLine } function ClrVar(SplitedLine) { if (var[SplitedLine[2]] == "") { print "ClrVar " SplitedLine[2] } else { print "ClrVar " var[SplitedLine[2]] } } # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- # percent文の時の処理 function Percent(SplitedLine, CurrentLine,i,randresult,paren) { randresult = int(100*rand())+1; CurrentLine = ""; if (SplitedLine[2]+0 >= randresult) { if (SplitedLine[3] ~ /{/) { paren = SplitedLine[3]; gsub("{","",paren); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren) { split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } else { for(i = 3; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i]; } split(CurrentLine,SplitedLine); Parser(SplitedLine); } } else { #@@@ここから 95 8 25 if (SplitedLine[3] ~ /{/) { paren = SplitedLine[3]; gsub("{","",paren); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren) { CurrentLine = NextLine(); } } } #@@@ここまで 95 8 25 } function OutPut(SplitedLine, CurrentLine,i,paren) { CurrentLine = ""; if (SplitedLine[2] ~ /{/) { paren = SplitedLine[2]; gsub("{","",paren); CurrentLine = NextLine(); CurrentLine = VarAna(CurrentLine); while (CurrentLine !~ "}" paren) { sub("^[" spaces "]*","",CurrentLine) print CurrentLine; CurrentLine = NextLine(); CurrentLine = VarAna(CurrentLine); } } else { for (i = 2; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i]; } CurrentLine = VarAna(CurrentLine); print CurrentLine } } function Call(SplitedLine, CurrentLine,i,x,y,paren) { CurrentLine = ""; if (Paragraph[SplitedLine[2],0] > 0 || SplitedLine[2] ~ /{/) { parahistory[SplitedLine[2]]++; if (SplitedLine[2] ~ /{/) { paren = SplitedLine[2]; gsub("{","",paren); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren) { sub("^[" spaces "]*","",CurrentLine) NextParagraph(CurrentLine); while (NotProtEndP()) { CurrentLine = Paragraph[stack[SP,CPN],stack[SP,CPL]]; split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } CurrentLine = NextLine(); } } else { NextParagraph(SplitedLine[2]); CurrentLine = Paragraph[stack[SP,CPN],stack[SP,CPL]]; while (NotProtEndP()) { split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } } for ( x in varhist) { split(x,y,"."); if (y[2] ~ /^[0-9]+$/ && varhist[x] != 0) { print "ClrVar " x; varhist[x] = 0; } } } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- # times文の時の処理 function Times(SplitedLine, i,dum,LineNumberback,CurrentLine,randresult,paren) { split(SplitedLine[2],dum,"d") if (dum[1] == "") { split(SplitedLine[2],dum,"D") } randresult = 0; for (i = 1; i <= dum[1]; i++) { randresult += int((dum[2]+0)*rand())+1; } CurrentLine = ""; if (SplitedLine[3] ~ /{/) { paren = SplitedLine[3]; gsub("{","",paren); stack[SP,CPL]++; LineNumberback = stack[SP,CPL]; for(i = 1; i <= randresult; i++) { stack[SP,CPL] = LineNumberback; CurrentLine = Paragraph[stack[SP,CPN],stack[SP,CPL]]; while (CurrentLine !~ "}" paren) { sub("^[" spaces "]*","",CurrentLine) split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } } else { CurrentLine = ""; for (i = 3; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i] } split(CurrentLine,SplitedLine); for(i = 1; i <= randresult; i++) { Parser(SplitedLine); } } } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- # radio文の時の処理 function Radio(SplitedLine, i,randresult,NestLevel,paren1,paren2) { randresult = int(100*rand())+1; CurrentLine = ""; if (SplitedLine[2] ~ /{/) { paren1 = SplitedLine[2]; gsub("{","",paren1); while (CurrentLine !~ "}" paren1) { CurrentLine = NextLine(); split(CurrentLine,SplitedLine) if (SplitedLine[1]+0 >= randresult) { CurrentLine = "" for (i = 2; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i]; } if (CurrentLine !~ /{/) { split(CurrentLine,SplitedLine); Parser(SplitedLine); } else { split(CurrentLine,SplitedLine); paren2 = SplitedLine[1]; gsub("{","",paren2); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren2) { split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } while (CurrentLine !~ "}" paren1) { CurrentLine = NextLine(); } } else { randresult -= SplitedLine[1]+0; } } } else { ERROR(2,"radio"); } } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- # exist文の処理 function exist(SplitedLine, i,CurrentLine,paren) { if (parahistory[SplitedLine[2]] > 0) { CurrentLine = "" if (SplitedLine[3] ~ /{/) { paren = SplitedLine[3]; gsub("{","",paren); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren) { sub("^[" spaces "]*","",CurrentLine) split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } else { for(i = 3; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i]; } split(CurrentLine,SplitedLine) Parser(SplitedLine) } } else { if (SplitedLine[3] ~ /{/) { paren = SplitedLine[3]; gsub("{","",paren); while (Paragraph[stack[SP,CPN],stack[SP,CPL]] !~ "}" paren) { stack[SP,CPL]++; } } } } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- # notexist文の処理 function notexist(SplitedLine, i,paren) { if (parahistory[SplitedLine[2]] == "") { CurrentLine = "" if (SplitedLine[3] ~ /{/) { paren = SplitedLine[3]; gsub("{","",paren); CurrentLine = NextLine(); while (CurrentLine !~ "}" paren) { sub("^[" spaces "]*","",CurrentLine) split(CurrentLine,SplitedLine); Parser(SplitedLine); CurrentLine = NextLine(); } } else { for(i = 3; SplitedLine[i] != ""; i++) { CurrentLine = CurrentLine " " SplitedLine[i]; } split(CurrentLine,SplitedLine) Parser(SplitedLine) } } else { if (SplitedLine[3] ~ /{/) { paren = SplitedLine[3]; gsub("{","",paren); while (Paragraph[stack[SP,CPN],stack[SP,CPL]] !~ "}" paren) { stack[SP,CPL]++; } } } } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- # 与えられた文字列が、パラグラフ・ネームならば、次にそのパラグラフを実行 # するための、処理を行う。 # 返り値=1 : 与えられた文字列はパラグラフ・ネーム # 返り値=0 : 与えられた文字列はパラグラフ・ネームでは無い。 function NextParagraph(NextParaName ,returnvalue) { prnt "NowIn NextParagraph" if (Paragraph[NextParaName,0] == "") { returnvalue = 0 ERROR(3,NextParaName); } else { SP++; stack[SP,CPN] = NextParaName; stack[SP,CPL] = 1; stack[SP,CPT] = 1; returnvalue = 1; parahistory[NextParaName]++; } return returnvalue; } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- # plot.DICの読み込み # 注釈文、空行は読み飛ばし。 function ReadParaData( ParaName,i,j,k) { print "プロットファイルを読み込み中" > "/dev/stderr" i = 0; j = 0; while (getline > 0) { gsub("^[" spaces "]+",""); gsub("#.*",""); if ($0 ~ /^[ ]*$/ || length($0) == 0 || $1 ~ /^[##]/) { continue; } else if ($1 ~ /^paragraph$/) { Paragraph[ParaName,0] = j - 1; ParaName = $2; printf("%s\t",ParaName) > "/dev/stderr"; Paragraph[ParaName,0] = 0; j = 1; } else if ($0 !~ "^[" spaces "]*$" && length($0) > 0) { Paragraph[ParaName,j] = $0; j++; } if (jindex(Paragraph[ParaName,j-1],"{")) { i++; gsub("{","{" ParaName "" i,Paragraph[ParaName,j-1]); } if (jindex(Paragraph[ParaName,j-1],"}")) { gsub("}","}" ParaName "" i,Paragraph[ParaName,j-1]); i--; } } Paragraph[ParaName,0] = j - 1; print "\nプロットファイルの読み込みを終了しました。" > "/dev/stderr" print "プロットを作成します。" > "/dev/stderr" } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- # -=-=- -=-=- FUNCTION -=-=- BEGIN -=-=- -=-=- -=-=- # 現在のパラグラフが終わったかどうかのチェック # 返り値=1 : まだ終わらない。 # 返り値=0 : 終わった。 function NotProtEndP( returnvalue) { if (Paragraph[stack[SP,CPN],0] > stack[SP,CPL]) { returnvalue = 1; # plotはまだ終わらない。 } else { stack[SP,CPT]--; returnvalue = 0; # plotは終了。 } if (returnvalue == 0 && SP > 1) { returnvalue = 0; SP--; } return returnvalue; } # -=-=- -=-=- FUNCTION -=-=- END -=-=- -=-=- -=-=- ########## # エラー出力 & 異常終了 function ERROR(code,s) { print "異常終了"; if (code == 1) { print "パラグラフ",s,"において、パラグラフの行数を越えて実行しようとしました!!"; } else if (code == 2) { print "パラグラフ",stack[SP,CPN],"の",CurrentLine,"において",s,"の書式が違います!!" } else if (code == 3) { print "パラグラフ", stack[SP,CPN],"の",CurrentLine,"において呼び出そうとしたパラグラフ",s,"は存在していません!!"; } exit; }