/\([a-z]\+\)=\([0-9]\+\)/ b assign /p[ \t]\+\([a-z]\+\)/ b put D :return # 変数テーブル # 一行に一個の変数名とその変数の値がスペースで区切られて入ってる # # ex) # foo = 10, bar = 20 # # だとしたら、 # # #foo 10 #bar 20 # # て感じで # # /^^/ { # ここに入らないように # ↑ top # 戻りラベル ([a-zA-Z-_]+) # 変数名 ([a-z]+) # 値 ([0-9]+) # ... # ↓bottom # :setvar # TODO: --escape--をなんとかする s/\([a-zA-Z-_]\+\n\([a-z]\+\)\n\([0-9]\+\)\)/\2 \3\n--escape--\n\1/ x G s/\n--escape.*// ## 同じ名前のがふたつあったら古い方を消す # /\(^\|\n\)\([a-z]\+\) .*\n\1 / s/\([^\n]\)[a-z]\+ [0-9]\+\n/\1/ # わからん… x s/^.*--escape--\n// b return # ↑ top # 戻りラベル ([a-zA-Z-_]+) # 変数名 ([a-z]+) # ... # result # ... # ↓bottom # # 上のほうにある "result" っていう文字列をその変数の数値に変換する :getvar s/$/\n--escape--/ G s/^\([a-zA-Z-_]\+\n\([a-z]\+\).*\)\n--escape--.*[a-z]\+ \([0-9]\+\)/\3\n\1/ s/\([0-9]\+\)\n\(.*\n\)result\(.*\)/\2\1\3/ b return } /^^/ { :assign s//\1\n\2/ s/^/assign-setvar-ret\n/ b setvar } /^assign-setvar-ret\n/ { d } /^^/ { :put s//\1/ s/$/\nresult/ s/^/put-getvar-ret\n/ b getvar } /^put-getvar-ret\n/ { s/^.*\n\([0-9]\+\)$/\1/ b end } :end