Advertisement
Guest User

ScriptEngine.cpp

a guest
Jan 25th, 2012
901
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 64.13 KB | None | 0 0
  1. #include"ScriptEngine.hpp"
  2. #include<vector>
  3. #include<cctype>
  4. #include<cstdio>
  5. #include<clocale>
  6. #include<cmath>
  7. #include<cassert>
  8.  
  9. #ifdef _MSC_VER
  10. #define for if(0);else for
  11. namespace std
  12. {
  13.     using::wcstombs;
  14.     using::mbstowcs;
  15.     using::isalpha;
  16.     using::fmodl;
  17.     using::powl;
  18.     using::swprintf;
  19.     using::atof;
  20.     using::isdigit;
  21.     using::isxdigit;
  22.     using::floorl;
  23.     using::ceill;
  24.     using::fabsl;
  25. }
  26.  
  27. #endif
  28.  
  29. using namespace gstd;
  30.  
  31.  
  32.     std::string gstd::to_mbcs(std::wstring const & s)
  33.     {
  34.         int len = std::wcstombs(NULL, s.c_str(), s.size());
  35.         if(len < 0)
  36.             return "(BAD-DATA)";
  37.         char * buffer = new char[len + 1];
  38.         std::wcstombs(buffer, s.c_str(), len);
  39.         std::string result(buffer, len);
  40.         delete[] buffer;
  41.         return result;
  42.     }
  43.  
  44.     std::wstring gstd::to_wide(std::string const & s)
  45.     {
  46.         int len = std::mbstowcs(NULL, s.c_str(), s.size());
  47.         wchar_t * buffer = new wchar_t[len + 1];
  48.         std::mbstowcs(buffer, s.c_str(), len);
  49.         std::wstring result(buffer, len);
  50.         delete[] buffer;
  51.         return result;
  52.     }
  53.  
  54. //--------------------------------------
  55.  
  56. /* parser_error */
  57.  
  58. class parser_error : public std::exception
  59. {
  60. public:
  61.     parser_error(std::string const & the_message) : std::exception(), message(the_message)
  62.     {
  63.     }
  64.  
  65.     virtual const char * what() const throw();
  66.  
  67. private:
  68.     std::string message;
  69. };
  70.  
  71. const char * parser_error::what() const throw()
  72. {
  73.     return message.c_str();
  74. }
  75.  
  76. /* lexical analyzer */
  77.  
  78. enum token_kind
  79. {
  80.     tk_end, tk_invalid, tk_word, tk_real, tk_char, tk_string, tk_open_par, tk_close_par, tk_open_bra, tk_close_bra,
  81.     tk_open_cur, tk_close_cur, tk_open_abs, tk_close_abs, tk_comma, tk_semicolon, tk_tilde, tk_assign, tk_plus, tk_minus,
  82.     tk_inc, tk_dec, tk_asterisk, tk_slash, tk_percent, tk_caret, tk_e, tk_g, tk_ge, tk_l, tk_le, tk_ne, tk_exclamation,
  83.     tk_ampersand, tk_and_then, tk_vertical, tk_or_else, tk_at, tk_add_assign, tk_subtract_assign, tk_multiply_assign,
  84.     tk_divide_assign, tk_remainder_assign, tk_power_assign, tk_range, tk_ALTERNATIVE, tk_ASCENT, tk_BREAK, tk_CASE, tk_DESCENT,
  85.     tk_ELSE, tk_FUNCTION, tk_IF, tk_IN, tk_LET, tk_LOCAL, tk_LOOP, tk_OTHERS, tk_REAL, tk_RETURN, tk_SUB, tk_TASK,
  86.     tk_TIMES, tk_WHILE, tk_YIELD
  87. };
  88.  
  89. class scanner
  90. {
  91. public:
  92.     char const * current;
  93.     token_kind next;
  94.     std::string word;
  95.     long double real_value;
  96.     wchar_t char_value;
  97.     std::wstring string_value;
  98.     int line;
  99.  
  100.     scanner(char const * source) : current(source), line(1)
  101.     {
  102.         advance();
  103.     }
  104.  
  105.     scanner(scanner const & source) : current(source.current), next(source.next), word(source.word), line(source.line)
  106.     {
  107.     }
  108.  
  109.     void skip();
  110.     void advance();
  111. };
  112.  
  113. void scanner::skip()
  114. {
  115.     //skip whitespace
  116.     while(* current == 13 || * current == 10 || * current == 9 || * current == 32
  117.        || * current == '#' || (* current == '/' && (current[1] == '/' || current[1] == '*')))
  118.        {
  119.            //skip comments
  120.            if(* current == '#' ||
  121.                (* current == '/' && (current[1] == '/' || current[1] == '*')))
  122.            {
  123.                if(* current == '#' || current[1] == '/')
  124.                {
  125.                    do
  126.                    {
  127.                        ++current;
  128.                    }
  129.                    while(*current!='\n'&&*current!='\r');
  130.                }
  131.                else
  132.                {
  133.                    current += 2;
  134.                    while(* current != '*' || current[1] != '/')
  135.                    {
  136.                        if(* current == '\n') ++line;
  137.                        ++current;
  138.                    }
  139.                    current += 2;
  140.                }
  141.            }
  142.            else if(* current == '\n')
  143.            {
  144.                ++line;
  145.                ++current;
  146.            }
  147.            else
  148.                ++current;
  149.     }
  150. }
  151.  
  152. void scanner::advance()
  153. {
  154.     skip();
  155.  
  156.     if(* current == 0)
  157.     {
  158.         next = tk_end;
  159.         return;
  160.     }
  161.  
  162.     switch(* current)
  163.     {
  164.         case '[':
  165.             next = tk_open_bra;
  166.             ++current;
  167.             break;
  168.         case ']':
  169.             next = tk_close_bra;
  170.             ++current;
  171.             break;
  172.         case '(':
  173.             next = tk_open_par;
  174.             ++current;
  175.             if(* current == '|')
  176.             {
  177.                 next = tk_open_abs;
  178.                 ++current;
  179.             }
  180.             break;
  181.         case ')':
  182.             next = tk_close_par;
  183.             ++current;
  184.             break;
  185.         case '{':
  186.             next = tk_open_cur;
  187.             ++current;
  188.             break;
  189.         case '}':
  190.             next = tk_close_cur;
  191.             ++current;
  192.             break;
  193.         case '@':
  194.             next = tk_at;
  195.             ++current;
  196.             break;
  197.         case ',':
  198.             next = tk_comma;
  199.             ++current;
  200.             break;
  201.         case ';':
  202.             next = tk_semicolon;
  203.             ++current;
  204.             break;
  205.         case '~':
  206.             next = tk_tilde;
  207.             ++current;
  208.             break;
  209.         case '*':
  210.             next = tk_asterisk;
  211.             ++current;
  212.             if(* current == '=')
  213.             {
  214.                 next = tk_multiply_assign;
  215.                 ++current;
  216.             }
  217.             break;
  218.         case '/':
  219.             next = tk_slash;
  220.             ++current;
  221.             if(* current == '=')
  222.             {
  223.                 next = tk_divide_assign;
  224.                 ++current;
  225.             }
  226.             break;
  227.         case '%':
  228.             next = tk_percent;
  229.             ++current;
  230.             if(* current == '=')
  231.             {
  232.                 next = tk_remainder_assign;
  233.                 ++current;
  234.             }
  235.             break;
  236.         case '^':
  237.             next = tk_caret;
  238.             ++current;
  239.             if(* current == '=')
  240.             {
  241.                 next = tk_power_assign;
  242.                 ++current;
  243.             }
  244.             break;
  245.         case '=':
  246.             next = tk_assign;
  247.             ++current;
  248.             if(* current == '=')
  249.             {
  250.                 next = tk_e;
  251.                 ++current;
  252.             }
  253.             break;
  254.         case '>':
  255.             next = tk_g;
  256.             ++current;
  257.             if(* current == '=')
  258.             {
  259.                 next = tk_ge;
  260.                 ++current;
  261.             }
  262.             break;
  263.         case '<':
  264.             next = tk_l;
  265.             ++current;
  266.             if(* current == '=')
  267.             {
  268.                 next = tk_le;
  269.                 ++current;
  270.             }
  271.             break;
  272.         case '!':
  273.             next = tk_exclamation;
  274.             ++current;
  275.             if(* current == '=')
  276.             {
  277.                 next = tk_ne;
  278.                 ++current;
  279.             }
  280.             break;
  281.         case '+':
  282.             next = tk_plus;
  283.             ++current;
  284.             if(* current == '+')
  285.             {
  286.                 next = tk_inc;
  287.                 ++current;
  288.             }
  289.             else if(* current == '=')
  290.             {
  291.                 next = tk_add_assign;
  292.                 ++current;
  293.             }
  294.             break;
  295.         case '-':
  296.             next = tk_minus;
  297.             ++current;
  298.             if(* current == '-')
  299.             {
  300.                 next = tk_dec;
  301.                 ++current;
  302.             }
  303.             else if(* current == '=')
  304.             {
  305.                 next = tk_subtract_assign;
  306.                 ++current;
  307.             }
  308.             break;
  309.         case '&':
  310.             next = tk_ampersand;
  311.             ++current;
  312.             if(* current == '&')
  313.             {
  314.                 next = tk_and_then;
  315.                 ++current;
  316.             }
  317.             break;
  318.         case '|':
  319.             next = tk_vertical;
  320.             ++current;
  321.             if(* current == '|')
  322.             {
  323.                 next = tk_or_else;
  324.                 ++current;
  325.             }
  326.             else if(* current == ')')
  327.             {
  328.                 next = tk_close_abs;
  329.                 ++current;
  330.             }
  331.             break;
  332.         case '.':
  333.             ++current;
  334.             if(* current == '.')
  335.             {
  336.                 next = tk_range;
  337.                 ++current;
  338.             }
  339.             else
  340.             {
  341.                 throw parser_error("単独のピリオドはこのスクリプトでは使いません");
  342.             }
  343.             break;
  344.  
  345.         case '\'':
  346.         case '\"':
  347.             {
  348.                 std::string s;
  349.                 char q = * current;
  350.                 next = (q == '\"') ? tk_string : tk_char;
  351.                 ++current;
  352.                 while(* current != q)
  353.                 {
  354.                     s += * current;
  355.                     ++current;
  356.                 }
  357.                 ++current;
  358.                 string_value = to_wide(s);
  359.                 if(q == '\'')
  360.                 {
  361.                     if(string_value.size() == 1)
  362.                         char_value = string_value[0];
  363.                     else
  364.                         throw parser_error("文字型の値の長さは1だけです");
  365.                 }
  366.             }
  367.             break;
  368.         case '\\':
  369.             {
  370.                 ++current;
  371.                 next = tk_char;
  372.                 char c = * current;
  373.                 ++current;
  374.                 switch(c)
  375.                 {
  376.                     case '0':
  377.                         char_value = L'\0';
  378.                         break;
  379.                     case 'n':
  380.                         char_value = L'\n';
  381.                         break;
  382.                     case 'r':
  383.                         char_value = L'\r';
  384.                         break;
  385.                     case 't':
  386.                         char_value = L'\t';
  387.                         break;
  388.                     case 'x':
  389.                         char_value = 0;
  390.                         while(std::isxdigit(* current))
  391.                         {
  392.                             char_value = char_value * 16 + (* current >= 'a') ? * current - 'a' + 10 : (* current >= 'A') ?
  393.                                * current - 'A' + 10 : * current - '0';
  394.                             ++current;
  395.                         }
  396.                         break;
  397.                     default:
  398.                         throw parser_error("特殊文字が変です(「\"...\"」を忘れていませんか)");
  399.                 }
  400.             }
  401.             break;
  402.         default:
  403.             if(std::isdigit(* current))
  404.             {
  405.                 next = tk_real;
  406.                 real_value = 0.0;
  407.                 do
  408.                 {
  409.                     real_value = real_value * 10. + (* current - '0');
  410.                     ++current;
  411.                 }
  412.                 while(std::isdigit(* current));
  413.                 if(* current == '.' && std::isdigit(* (current + 1)))
  414.                 {
  415.                     ++current;
  416.                     long double d = 1;
  417.                     while(std::isdigit(* current))
  418.                     {
  419.                         d = d / 10;
  420.                         real_value = real_value + d * (* current - '0');
  421.                         ++current;
  422.                     }
  423.                 }
  424.             }
  425.             else if(std::isalpha(* current) || * current == '_')
  426.             {
  427.                 next = tk_word;
  428.                 word = "";
  429.                 do
  430.                 {
  431.                     word += * current;
  432.                     ++current;
  433.                 }while(std::isalpha(* current) || * current == '_' || std::isdigit(* current));
  434.  
  435.                 if(word == "alternative")
  436.                     next = tk_ALTERNATIVE;
  437.                 else if(word == "ascent")
  438.                     next = tk_ASCENT;
  439.                 else if(word == "break")
  440.                     next = tk_BREAK;
  441.                 else if(word == "case")
  442.                     next = tk_CASE;
  443.                 else if(word == "descent")
  444.                     next = tk_DESCENT;
  445.                 else if(word == "else")
  446.                     next = tk_ELSE;
  447.                 else if(word == "function")
  448.                     next = tk_FUNCTION;
  449.                 else if(word == "if")
  450.                     next = tk_IF;
  451.                 else if(word == "in")
  452.                     next = tk_IN;
  453.                 else if(word == "let" || word == "var")
  454.                     next = tk_LET;
  455.                 else if(word == "local")
  456.                     next = tk_LOCAL;
  457.                 else if(word == "loop")
  458.                     next = tk_LOOP;
  459.                 else if(word == "others")
  460.                     next = tk_OTHERS;
  461.                 else if(word == "real")
  462.                     next = tk_REAL;
  463.                 else if(word == "return")
  464.                     next = tk_RETURN;
  465.                 else if(word == "sub")
  466.                     next = tk_SUB;
  467.                 else if(word == "task")
  468.                     next = tk_TASK;
  469.                 else if(word == "times")
  470.                     next = tk_TIMES;
  471.                 else if(word == "while")
  472.                     next = tk_WHILE;
  473.                 else if(word == "yield")
  474.                     next = tk_YIELD;
  475.             }
  476.             else
  477.             {
  478.                 next = tk_invalid;
  479.             }
  480.     }
  481. }
  482.  
  483. /* operations */
  484.  
  485. value add(script_machine * machine, int argc, value const * argv)
  486. {
  487.     assert(argc == 2);
  488.     if(argv[0].get_type()->get_kind() == type_data::tk_array)
  489.     {
  490.         if(argv[0].get_type() != argv[1].get_type())
  491.         {
  492.             machine->raise_error("型が一致しません");
  493.             return value();
  494.         }
  495.         if(argv[0].length_as_array() != argv[1].length_as_array())
  496.         {
  497.             machine->raise_error("長さが一致しません");
  498.             return value();
  499.         }
  500.         value result;
  501.         for(unsigned i = 0; i < argv[1].length_as_array(); ++i)
  502.         {
  503.             value v[2];
  504.             v[0] = argv[0].index_as_array(i);
  505.             v[1] = argv[1].index_as_array(i);
  506.             result.append(argv[1].get_type(), add(machine, 2, v));
  507.         }
  508.         return result;
  509.     }
  510.     else
  511.         return value(machine->get_engine()->get_real_type(), argv[0].as_real() + argv[1].as_real());
  512. }
  513.  
  514. value subtract(script_machine * machine, int argc, value const * argv)
  515. {
  516.     assert(argc == 2);
  517.     if(argv[0].get_type()->get_kind() == type_data::tk_array)
  518.     {
  519.         if(argv[0].get_type() != argv[1].get_type())
  520.         {
  521.             machine->raise_error("型が一致しません");
  522.             return value();
  523.         }
  524.         if(argv[0].length_as_array() != argv[1].length_as_array())
  525.         {
  526.             machine->raise_error("長さが一致しません");
  527.             return value();
  528.         }
  529.         value result;
  530.         for(unsigned i = 0; i < argv[1].length_as_array(); ++i)
  531.         {
  532.             value v[2];
  533.             v[0] = argv[0].index_as_array(i);
  534.             v[1] = argv[1].index_as_array(i);
  535.             result.append(argv[1].get_type(), subtract(machine, 2, v));
  536.         }
  537.         return result;
  538.     }
  539.     else
  540.         return value(machine->get_engine()->get_real_type(), argv[0].as_real() - argv[1].as_real());
  541. }
  542.  
  543. value multiply(script_machine * machine, int argc, value const * argv)
  544. {
  545.     return value(machine->get_engine()->get_real_type(), argv[0].as_real() * argv[1].as_real());
  546. }
  547.  
  548. value divide(script_machine * machine, int argc, value const * argv)
  549. {
  550.     return value(machine->get_engine()->get_real_type(), argv[0].as_real() / argv[1].as_real());
  551. }
  552.  
  553. value remainder(script_machine * machine, int argc, value const * argv)
  554. {
  555.     long double x = argv[0].as_real();
  556.     long double y = argv[1].as_real();
  557.     return value(machine->get_engine()->get_real_type(), std::fmodl(x, y));
  558. }
  559.  
  560. value negative(script_machine * machine, int argc, value const * argv)
  561. {
  562.     return value(machine->get_engine()->get_real_type(), -argv[0].as_real());
  563. }
  564.  
  565. value power(script_machine * machine, int argc, value const * argv)
  566. {
  567.     return value(machine->get_engine()->get_real_type(), std::powl(argv[0].as_real(), argv[1].as_real()));
  568. }
  569.  
  570. value compare(script_machine * machine, int argc, value const * argv)
  571. {
  572.     if(argv[0].get_type() == argv[1].get_type())
  573.     {
  574.         int r = 0;
  575.  
  576.         switch(argv[0].get_type()->get_kind())
  577.         {
  578.             case type_data::tk_real:
  579.                 {
  580.                     long double a = argv[0].as_real();
  581.                     long double b = argv[1].as_real();
  582.                     r = (a == b) ? 0 : (a < b) ? -1 : 1;
  583.                 }
  584.                 break;
  585.  
  586.             case type_data::tk_char:
  587.                 {
  588.                     wchar_t a = argv[0].as_char();
  589.                     wchar_t b = argv[1].as_char();
  590.                     r = (a == b) ? 0 : (a < b) ? -1 : 1;
  591.                 }
  592.                 break;
  593.  
  594.             case type_data::tk_boolean:
  595.                 {
  596.                     bool a = argv[0].as_boolean();
  597.                     bool b = argv[1].as_boolean();
  598.                     r = (a == b) ? 0 : (a < b) ? -1 : 1;
  599.                 }
  600.                 break;
  601.  
  602.             case type_data::tk_array:
  603.                 {
  604.                     for(unsigned i = 0; i < argv[0].length_as_array(); ++i)
  605.                     {
  606.                         if(i >= argv[1].length_as_array())
  607.                         {
  608.                             r = +1; //"123" > "12"
  609.                             break;
  610.                         }
  611.  
  612.                         value v[2];
  613.                         v[0] = argv[0].index_as_array(i);
  614.                         v[1] = argv[1].index_as_array(i);
  615.                         r = compare(machine, 2, v).as_real();
  616.                         if(r != 0)
  617.                             break;
  618.                     }
  619.                     if(r == 0 && argv[0].length_as_array() < argv[1].length_as_array())
  620.                     {
  621.                         r = -1; //"12" < "123"
  622.                     }
  623.                 }
  624.                 break;
  625.  
  626.             default:
  627.                 assert(false);
  628.         }
  629.         return value(machine->get_engine()->get_real_type(), static_cast < long double > (r));
  630.     }
  631.     else
  632.     {
  633.         machine->raise_error("An attempt of comparison between different types was made"); //型が違う値同士を比較しようとしました
  634.         return value();
  635.     }
  636. }
  637.  
  638. value predecessor(script_machine * machine, int argc, value const * argv)
  639. {
  640.     assert(argc == 1);
  641.     assert(argv[0].has_data());
  642.     switch(argv[0].get_type()->get_kind())
  643.     {
  644.         case type_data::tk_real:
  645.             return value(argv[0].get_type(), argv[0].as_real() - 1);
  646.  
  647.         case type_data::tk_char:
  648.             {
  649.                 wchar_t c = argv[0].as_char();
  650.                 --c;
  651.                 return value(argv[0].get_type(), c);
  652.             }
  653.         case type_data::tk_boolean:
  654.             return value(argv[0].get_type(), false);
  655.         default:
  656.             machine->raise_error("(value) predecessor of this type cannot be used"); //この型の値にpredecessorは使えません
  657.             return value();
  658.     }
  659. }
  660.  
  661. value successor(script_machine * machine, int argc, value const * argv)
  662. {
  663.     assert(argc == 1);
  664.     assert(argv[0].has_data());
  665.     switch(argv[0].get_type()->get_kind())
  666.     {
  667.         case type_data::tk_real:
  668.             return value(argv[0].get_type(), argv[0].as_real() + 1);
  669.  
  670.         case type_data::tk_char:
  671.             {
  672.                 wchar_t c = argv[0].as_char();
  673.                 ++c;
  674.                 return value(argv[0].get_type(), c);
  675.             }
  676.         case type_data::tk_boolean:
  677.             return value(argv[0].get_type(), true);
  678.         default:
  679.             machine->raise_error("(value) successor of this type cannot be used"); //この型の値にsuccessorは使えません
  680.             return value();
  681.     }
  682. }
  683.  
  684. value true_(script_machine * machine, int argc, value const * argv)
  685. {
  686.     return value(machine->get_engine()->get_boolean_type(), true);
  687. }
  688.  
  689. value false_(script_machine * machine, int argc, value const * argv)
  690. {
  691.     return value(machine->get_engine()->get_boolean_type(), false);
  692. }
  693.  
  694. value not_(script_machine * machine, int argc, value const * argv)
  695. {
  696.     return value(machine->get_engine()->get_boolean_type(), !argv[0].as_boolean());
  697. }
  698.  
  699. value length(script_machine * machine, int argc, value const * argv)
  700. {
  701.     assert(argc == 1);
  702.     return value(machine->get_engine()->get_real_type(), static_cast < long double > (argv[0].length_as_array()));
  703. }
  704.  
  705. value index(script_machine * machine, int argc, value const * argv)
  706. {
  707.     assert(argc == 2);
  708.  
  709.     if(argv[0].get_type()->get_kind() != type_data::tk_array)
  710.     {
  711.         machine->raise_error("配列以外にindexを使いました");
  712.         return value();
  713.     }
  714.  
  715.     long double index = argv[1].as_real();
  716.  
  717.     if(index != static_cast < int > (index))
  718.     {
  719.         machine->raise_error("小数点以下があります");
  720.         return value();
  721.     }
  722.  
  723.     if(index < 0 || index >= argv[0].length_as_array())
  724.     {
  725.         machine->raise_error("配列のサイズを超えています");
  726.         return value();
  727.     }
  728.  
  729.     value const & result = argv[0].index_as_array(index);
  730.     return result;
  731. }
  732.  
  733. value index_writable(script_machine * machine, int argc, value const * argv)
  734. {
  735.     assert(argc == 2);
  736.  
  737.     if(argv[0].get_type()->get_kind() != type_data::tk_array)
  738.     {
  739.         machine->raise_error("配列以外にindex!を使いました");
  740.         return value();
  741.     }
  742.  
  743.     long double index = argv[1].as_real();
  744.  
  745.     if(index != static_cast < int > (index))
  746.     {
  747.         machine->raise_error("小数点以下があります");
  748.         return value();
  749.     }
  750.  
  751.     if(index < 0 || index >= argv[0].length_as_array())
  752.     {
  753.         machine->raise_error("配列のサイズを超えています");
  754.         return value();
  755.     }
  756.  
  757.     value const & result = argv[0].index_as_array(index);
  758.     result.unique();
  759.     return result;
  760. }
  761.  
  762. value slice(script_machine * machine, int argc, value const * argv)
  763. {
  764.     assert(argc == 3);
  765.  
  766.     if(argv[0].get_type()->get_kind() != type_data::tk_array)
  767.     {
  768.         machine->raise_error("配列以外にsliceを使いました");
  769.         return value();
  770.     }
  771.  
  772.     long double index_1 = argv[1].as_real();
  773.  
  774.     if(index_1 != static_cast < int > (index_1))
  775.     {
  776.         machine->raise_error("開始位置に小数点以下があります");
  777.         return value();
  778.     }
  779.  
  780.     long double index_2 = argv[2].as_real();
  781.  
  782.     if(index_2 != static_cast < int > (index_2))
  783.     {
  784.         machine->raise_error("終端位置に小数点以下があります");
  785.         return value();
  786.     }
  787.  
  788.     if(index_1 < 0 || index_1 > index_2 || index_2 > argv[0].length_as_array())
  789.     {
  790.         machine->raise_error("配列のサイズを超えています");
  791.         return value();
  792.     }
  793.  
  794.     value result(argv[0].get_type(), std::wstring());
  795.  
  796.     for(int i = index_1; i < index_2; ++i)
  797.     {
  798.         result.append(result.get_type(), argv[0].index_as_array(i));
  799.     }
  800.  
  801.     return result;
  802. }
  803.  
  804. value erase(script_machine * machine, int argc, value const * argv)
  805. {
  806.     assert(argc == 2);
  807.  
  808.     if(argv[0].get_type()->get_kind() != type_data::tk_array)
  809.     {
  810.         machine->raise_error("配列以外にeraseを使いました");
  811.         return value();
  812.     }
  813.  
  814.     long double index_1 = argv[1].as_real();
  815.     double length = argv[0].length_as_array();
  816.  
  817.     if(index_1 != static_cast < int > (index_1))
  818.     {
  819.         machine->raise_error("削除位置に小数点以下があります");
  820.         return value();
  821.     }
  822.  
  823.     if(index_1 < 0 || index_1 >= argv[0].length_as_array())
  824.     {
  825.         machine->raise_error("Exeeds the size of the array"); //配列のサイズを超えています
  826.         return value();
  827.     }
  828.  
  829.     value result(argv[0].get_type(), std::wstring());
  830.  
  831.     for(int i = 0; i < index_1; ++i)
  832.     {
  833.         result.append(result.get_type(), argv[0].index_as_array(i));
  834.     }
  835.     for(int i = index_1 + 1; i < length; ++i)
  836.     {
  837.         result.append(result.get_type(), argv[0].index_as_array(i));
  838.     }
  839.     return result;
  840. }
  841.  
  842. value append(script_machine * machine, int argc, value const * argv)
  843. {
  844.     assert(argc == 2);
  845.  
  846.     if(argv[0].get_type()->get_kind() != type_data::tk_array)
  847.     {
  848.         machine->raise_error("配列以外にappendを使いました");
  849.         return value();
  850.     }
  851.  
  852.     if(argv[0].length_as_array() > 0 && argv[0].get_type()->get_element() != argv[1].get_type())
  853.     {
  854.         machine->raise_error("type mismatch"); //型が一致しません
  855.         return value();
  856.     }
  857.  
  858.     value result = argv[0];
  859.     result.append(machine->get_engine()->get_array_type(argv[1].get_type()), argv[1]);
  860.     return result;
  861. }
  862.  
  863. value concatenate(script_machine * machine, int argc, value const * argv)
  864. {
  865.     assert(argc == 2);
  866.  
  867.     if(argv[0].get_type()->get_kind() != type_data::tk_array || argv[1].get_type()->get_kind() != type_data::tk_array)
  868.     {
  869.         machine->raise_error("配列以外にconcatenateを使いました");
  870.         return value();
  871.     }
  872.  
  873.     if(argv[0].length_as_array() > 0 && argv[1].length_as_array() > 0 && argv[0].get_type() != argv[1].get_type())
  874.     {
  875.         machine->raise_error("Type mismatch"); //型が一致しません
  876.         return value();
  877.     }
  878.  
  879.     value result = argv[0];
  880.     result.concatenate(argv[1]);
  881.     return result;
  882. }
  883.  
  884. value round(script_machine * machine, int argc, value const * argv)
  885. {
  886.     long double r = std::floorl(argv[0].as_real() + 0.5);
  887.     return value(machine->get_engine()->get_real_type(), r);
  888. }
  889.  
  890. value truncate(script_machine * machine, int argc, value const * argv)
  891. {
  892.     long double r = argv[0].as_real();
  893.     r = (r > 0) ? std::floorl(r) : std::ceill(r);
  894.     return value(machine->get_engine()->get_real_type(), r);
  895. }
  896.  
  897. value ceil(script_machine * machine, int argc, value const * argv)
  898. {
  899.     return value(machine->get_engine()->get_real_type(), std::ceill(argv[0].as_real()));
  900. }
  901.  
  902. value floor(script_machine * machine, int argc, value const * argv)
  903. {
  904.     return value(machine->get_engine()->get_real_type(), std::floorl(argv[0].as_real()));
  905. }
  906.  
  907. value absolute(script_machine * machine, int argc, value const * argv)
  908. {
  909.     long double r = std::fabsl(argv[0].as_real());
  910.     return value(machine->get_engine()->get_real_type(), r);
  911. }
  912.  
  913. value pi(script_machine * machine, int argc, value const * argv)
  914. {
  915.     return value(machine->get_engine()->get_real_type(), (long double) 3.14159265358979323846);
  916. }
  917.  
  918. value assert_(script_machine * machine, int argc, value const * argv)
  919. {
  920.   assert(argc == 2);
  921.   if(!argv[0].as_boolean()){
  922.     machine->raise_error(to_mbcs(argv[1].as_string()));
  923.   }
  924.   return value();
  925. }
  926.  
  927. function const operations[] =
  928. {
  929.     {"true", true_, 0},
  930.     {"false", false_, 0},
  931.     {"pi", pi, 0},
  932.     {"length", length, 1},
  933.     {"not", not_, 1},
  934.     {"negative", negative, 1},
  935.     {"predecessor", predecessor, 1},
  936.     {"successor", successor, 1},
  937.     {"round", round, 1},
  938.     {"trunc", truncate, 1},
  939.     {"truncate", truncate, 1},
  940.     {"ceil", ceil, 1},
  941.     {"floor", floor, 1},
  942.     {"absolute", absolute, 1},
  943.     {"add", add, 2},
  944.     {"subtract", subtract, 2},
  945.     {"multiply", multiply, 2},
  946.     {"divide", divide, 2},
  947.     {"remainder", remainder, 2},
  948.     {"power", power, 2},
  949.     {"index", index, 2},
  950.     {"index!", index_writable, 2},
  951.     {"slice", slice, 3},
  952.     {"erase", erase, 2},
  953.     {"append", append, 2},
  954.     {"concatenate", concatenate, 2},
  955.     {"compare", compare, 2},
  956.     {"assert", assert_, 2}
  957. };
  958.  
  959.  
  960. /* parser */
  961.  
  962. class parser
  963. {
  964. public:
  965.     struct symbol
  966.     {
  967.         int level;
  968.         script_engine::block * sub;
  969.         int variable;
  970.     };
  971.  
  972.     struct scope : public std::map < std::string, symbol >
  973.     {
  974.         script_engine::block_kind kind;
  975.  
  976.         scope(script_engine::block_kind the_kind) : kind(the_kind)
  977.         {
  978.         }
  979.     };
  980.  
  981.     std::vector < scope > frame; //because frame is a vector who's elements inherit hash maps, accessing the contents of the elements would require dereference twice. ex: frame[0]["name"] //(element)
  982.     scanner * lex;
  983.     script_engine * engine;
  984.     bool error;
  985.     std::string error_message;
  986.     int error_line;
  987.     std::map < std::string, script_engine::block * > events;
  988.  
  989.     parser(script_engine * e, scanner * s, int funcc, function const * funcv);
  990.  
  991.     virtual ~parser()
  992.     {
  993.     }
  994.  
  995.     void parse_parentheses(script_engine::block * block);
  996.     void parse_clause(script_engine::block * block);
  997.     void parse_prefix(script_engine::block * block);
  998.     void parse_suffix(script_engine::block * block);
  999.     void parse_product(script_engine::block * block);
  1000.     void parse_sum(script_engine::block * block);
  1001.     void parse_comparison(script_engine::block * block);
  1002.     void parse_logic(script_engine::block * block);
  1003.     void parse_expression(script_engine::block * block);
  1004.     int parse_arguments(script_engine::block * block);
  1005.     void parse_statements(script_engine::block * block);
  1006.     void parse_inline_block(script_engine::block * block, script_engine::block_kind kind);
  1007.     void parse_block(script_engine::block * block, std::vector < std::string > const * args, bool adding_result);
  1008. private:
  1009.     void register_function(function const & func);
  1010.     symbol * search(std::string const & name);
  1011.     symbol * search_result();
  1012.     void scan_current_scope(int level, std::vector < std::string > const * args, bool adding_result);
  1013.     void write_operation(script_engine::block * block, char const * name, int clauses);
  1014.  
  1015.     typedef script_engine::code code;
  1016. };
  1017.  
  1018. parser::parser(script_engine * e, scanner * s, int funcc, function const * funcv) : engine(e), lex(s), frame(), error(false)
  1019. {
  1020.     frame.push_back(scope(script_engine::bk_normal));
  1021.  
  1022.     for(int i = 0; i < sizeof(operations) / sizeof(function); ++i)
  1023.         register_function(operations[i]);
  1024.  
  1025.     for(int i = 0; i < funcc; ++i)
  1026.         register_function(funcv[i]);
  1027.  
  1028.     try
  1029.     {
  1030.         scan_current_scope(0, NULL, false);
  1031.         parse_statements(engine->main_block);
  1032.         if(lex->next != tk_end)
  1033.             throw parser_error("cannot be interpreted. (did you forget \";\"?"); //解釈できないものがあります(「;」を忘れていませんか)
  1034.     }
  1035.     catch(parser_error & e)
  1036.     {
  1037.         error = true;
  1038.         error_message = e.what();
  1039.         error_line = lex->line;
  1040.     }
  1041. }
  1042.  
  1043. void parser::register_function(function const & func)
  1044. {
  1045.     symbol s;
  1046.     s.level = 0;
  1047.     s.sub = engine->new_block(0, script_engine::bk_function);
  1048.     s.sub->arguments = func.arguments;
  1049.     s.sub->name = func.name;
  1050.     s.sub->func = func.func;
  1051.     s.variable = -1;
  1052.     frame[0] [func.name] = s;
  1053. }
  1054.  
  1055. parser::symbol * parser::search(std::string const & name)
  1056. {
  1057.     for(int i = frame.size() - 1; i >= 0; --i)
  1058.     {
  1059.         if(frame[i].find(name) != frame[i].end())
  1060.             return & (frame[i] [name]);
  1061.     }
  1062.     return NULL;
  1063. }
  1064.  
  1065. parser::symbol * parser::search_result()
  1066. {
  1067.     for(int i = frame.size() - 1; i >= 0; --i)
  1068.     {
  1069.         if(frame[i].find("result") != frame[i].end())
  1070.             return & (frame[i] ["result"]);
  1071.         if(frame[i].kind == script_engine::bk_sub || frame[i].kind == script_engine::bk_microthread)
  1072.             return NULL;
  1073.     }
  1074.     return NULL;
  1075. }
  1076.  
  1077. void parser::scan_current_scope(int level, std::vector < std::string > const * args, bool adding_result)
  1078. {
  1079.     //look ahead to register an identifier //先読みして識別子を登録する
  1080.     scanner lex2(* lex);
  1081.     try
  1082.     {
  1083.         scope * current_frame = & frame[frame.size() - 1];
  1084.         int cur = 0;
  1085.         int var = 0;
  1086.  
  1087.         if(adding_result)
  1088.         {
  1089.             symbol s;
  1090.             s.level = level;
  1091.             s.sub = NULL;
  1092.             s.variable = var;
  1093.             ++var;
  1094.             (* current_frame) ["result"] = s;
  1095.         }
  1096.  
  1097.         if(args != NULL)
  1098.         {
  1099.             for(unsigned i = 0; i < args->size(); ++i)
  1100.             {
  1101.                 symbol s;
  1102.                 s.level = level;
  1103.                 s.sub = NULL;
  1104.                 s.variable = var;
  1105.                 ++var;
  1106.                 (* current_frame) [(* args) [i]] = s;
  1107.             }
  1108.         }
  1109.  
  1110.         while(cur >= 0 && lex2.next != tk_end && lex2.next != tk_invalid)
  1111.         {
  1112.             switch(lex2.next)
  1113.             {
  1114.                 case tk_open_cur:
  1115.                     ++cur;
  1116.                     lex2.advance();
  1117.                     break;
  1118.                 case tk_close_cur:
  1119.                     --cur;
  1120.                     lex2.advance();
  1121.                     break;
  1122.                 case tk_at:
  1123.                 case tk_SUB:
  1124.                 case tk_FUNCTION:
  1125.                 case tk_TASK:
  1126.                     {
  1127.                         token_kind type = lex2.next;
  1128.                         lex2.advance();
  1129.                         if(cur == 0)
  1130.                         {
  1131.                             if((* current_frame).find(lex2.word) != (* current_frame).end())
  1132.                                 throw parser_error("A routine is defined twice"); //同じスコープで同名のルーチンが複数宣言されています
  1133.                             script_engine::block_kind kind = (type == tk_SUB || type == tk_at) ? script_engine::bk_sub :
  1134.                                (type == tk_FUNCTION) ? script_engine::bk_function : script_engine::bk_microthread;
  1135.  
  1136.                             symbol s;
  1137.                             s.level = level;
  1138.                             s.sub = engine->new_block(level + 1, kind);
  1139.                             s.sub->name = lex2.word;
  1140.                             s.sub->func = NULL;
  1141.                             s.variable = -1;
  1142.                             (* current_frame) [lex2.word] = s;
  1143.                             lex2.advance();
  1144.                             if(kind != script_engine::bk_sub && lex2.next == tk_open_par)
  1145.                             {
  1146.                                 lex2.advance();
  1147.                                 while(lex2.next == tk_word || lex2.next == tk_LET || lex2.next == tk_REAL)
  1148.                                 {
  1149.                                     ++(s.sub->arguments);
  1150.                                     if(lex2.next == tk_LET || lex2.next == tk_REAL) lex2.advance();
  1151.                                     if(lex2.next == tk_word) lex2.advance();
  1152.                                     if(lex2.next != tk_comma)
  1153.                                         break;
  1154.                                     lex2.advance();
  1155.                                 }
  1156.                             }
  1157.                         }
  1158.                     }
  1159.                     break;
  1160.                 case tk_REAL:
  1161.                 case tk_LET:
  1162.                     lex2.advance();
  1163.                     if(cur == 0)
  1164.                     {
  1165. #ifdef __SCRIPT_H__NO_CHECK_DUPLICATED
  1166.             if(lex2.word == "result"){
  1167. #endif
  1168.                         if((* current_frame).find(lex2.word) != (* current_frame).end())
  1169.                           {
  1170.                               throw parser_error("Variables with the same name are declared in the same scope"); //同じスコープで同名の変数が複数宣言されています
  1171.                         }
  1172. #ifdef __SCRIPT_H__NO_CHECK_DUPLICATED
  1173.             }
  1174. #endif
  1175.                         symbol s;
  1176.                         s.level = level;
  1177.                         s.sub = NULL;
  1178.                         s.variable = var;
  1179.                         ++var;
  1180.                         (* current_frame) [lex2.word] = s;
  1181.                         lex2.advance();
  1182.                     }
  1183.                     break;
  1184.                 default:
  1185.                     lex2.advance();
  1186.             }
  1187.         }
  1188.     }
  1189.     catch(parser_error e)
  1190.     {
  1191.         lex->line = lex2.line;
  1192.         throw;
  1193.     }
  1194. }
  1195.  
  1196. void parser::write_operation(script_engine::block * block, char const * name, int clauses)
  1197. {
  1198.     symbol * s = search(name);
  1199.     assert(s != NULL);
  1200.     if(s->sub->arguments != clauses)
  1201.         throw parser_error("演算子に対応する関数が上書き定義されましたが引数の数が違います");
  1202.  
  1203.     block->codes.push_back(script_engine::code(lex->line, script_engine::pc_call_and_push_result, s->sub, clauses));
  1204. }
  1205.  
  1206. void parser::parse_parentheses(script_engine::block * block)
  1207. {
  1208.     if(lex->next != tk_open_par)
  1209.         throw parser_error("\"(\" is required"); //\"(\"が必要です  // "(" Is required
  1210.     lex->advance();
  1211.  
  1212.     parse_expression(block);
  1213.  
  1214.     if(lex->next != tk_close_par)
  1215.         throw parser_error("\")\" is required"); //"\")\"が必要です" // ")" Is required
  1216.     lex->advance();
  1217. }
  1218.  
  1219. void parser::parse_clause(script_engine::block * block)
  1220. {
  1221.     if(lex->next == tk_real)
  1222.     {
  1223.         block->codes.push_back(code(lex->line, script_engine::pc_push_value, value(engine->get_real_type(), lex->real_value)));
  1224.         lex->advance();
  1225.     }
  1226.     else if(lex->next == tk_char)
  1227.     {
  1228.         block->codes.push_back(code(lex->line, script_engine::pc_push_value, value(engine->get_char_type(), lex->char_value)));
  1229.         lex->advance();
  1230.     }
  1231.     else if(lex->next == tk_string)
  1232.     {
  1233.         std::wstring str = lex->string_value;
  1234.         lex->advance();
  1235.         while(lex->next == tk_string || lex->next == tk_char)
  1236.         {
  1237.             str += (lex->next == tk_string) ? lex->string_value : (std::wstring() + lex->char_value);
  1238.             lex->advance();
  1239.         }
  1240.  
  1241.         block->codes.push_back(code(lex->line, script_engine::pc_push_value, value(engine->get_string_type(), str)));
  1242.     }
  1243.     else if(lex->next == tk_word)
  1244.     {
  1245.         symbol * s = search(lex->word);
  1246.         if(s == NULL)
  1247.             throw parser_error(lex->word + "は未定義の識別子です");
  1248.  
  1249.         lex->advance();
  1250.  
  1251.         if(s->sub != NULL)
  1252.         {
  1253.             if(s->sub->kind != script_engine::bk_function)
  1254.                 throw parser_error("subやtaskは式中で呼べません");
  1255.  
  1256.             int argc = parse_arguments(block);
  1257.  
  1258.             if(argc != s->sub->arguments)
  1259.                 throw parser_error(s->sub->name + "の引数の数が違います");
  1260.  
  1261.             block->codes.push_back(code(lex->line, script_engine::pc_call_and_push_result, s->sub, argc));
  1262.         }
  1263.         else
  1264.         {
  1265.             //変数
  1266.             block->codes.push_back(code(lex->line, script_engine::pc_push_variable, s->level, s->variable));
  1267.         }
  1268.     }
  1269.     else if(lex->next == tk_open_bra)
  1270.     {
  1271.         lex->advance();
  1272.         block->codes.push_back(code(lex->line, script_engine::pc_push_value, value(engine->get_string_type(), std::wstring())));
  1273.         while(lex->next != tk_close_bra)
  1274.         {
  1275.             parse_expression(block);
  1276.             write_operation(block, "append", 2);
  1277.             if(lex->next != tk_comma) break;
  1278.             lex->advance();
  1279.         }
  1280.         if(lex->next != tk_close_bra)
  1281.             throw parser_error("\"]\"が必要です");
  1282.         lex->advance();
  1283.     }
  1284.     else if(lex->next == tk_open_abs)
  1285.     {
  1286.         lex->advance();
  1287.         parse_expression(block);
  1288.         write_operation(block, "absolute", 1);
  1289.         if(lex->next != tk_close_abs)
  1290.             throw parser_error("\"|)\"is required"); //\"|)\"が必要です
  1291.         lex->advance();
  1292.     }
  1293.     else if(lex->next == tk_open_par)
  1294.     {
  1295.         parse_parentheses(block);
  1296.     }
  1297.     else
  1298.     {
  1299.         throw parser_error("There is not a valid expression term"); //項として無効な式があります
  1300.     }
  1301. }
  1302.  
  1303. void parser::parse_suffix(script_engine::block * block)
  1304. {
  1305.     parse_clause(block);
  1306.     if(lex->next == tk_caret)
  1307.     {
  1308.         lex->advance();
  1309.         parse_suffix(block); //再帰
  1310.         write_operation(block, "power", 2);
  1311.     }
  1312.   else
  1313.   {
  1314.     while(lex->next == tk_open_bra)
  1315.     {
  1316.       lex->advance();
  1317.       parse_expression(block);
  1318.  
  1319.       if(lex->next == tk_range)
  1320.       {
  1321.         lex->advance();
  1322.         parse_expression(block);
  1323.         write_operation(block, "slice", 3);
  1324.       }
  1325.       else
  1326.       {
  1327.         write_operation(block, "index", 2);
  1328.       }
  1329.  
  1330.       if(lex->next != tk_close_bra)
  1331.         throw parser_error("\"]\" is required"); //\"]\"が必要です
  1332.       lex->advance();
  1333.     }
  1334.   }
  1335. }
  1336.  
  1337. void parser::parse_prefix(script_engine::block * block)
  1338. {
  1339.   if(lex->next == tk_plus)
  1340.   {
  1341.     lex->advance();
  1342.     parse_prefix(block);    //再帰
  1343.   }
  1344.   else if(lex->next == tk_minus)
  1345.   {
  1346.     lex->advance();
  1347.     parse_prefix(block);    //再帰
  1348.     write_operation(block, "negative", 1);
  1349.   }
  1350.   else if(lex->next == tk_exclamation)
  1351.   {
  1352.     lex->advance();
  1353.     parse_prefix(block);    //再帰
  1354.     write_operation(block, "not", 1);
  1355.   }
  1356.   else
  1357.   {
  1358.     parse_suffix(block);
  1359.   }
  1360. }
  1361.  
  1362. void parser::parse_product(script_engine::block * block)
  1363. {
  1364.     parse_prefix(block);
  1365.     while(lex->next == tk_asterisk || lex->next == tk_slash || lex->next == tk_percent)
  1366.     {
  1367.         char const * name = (lex->next == tk_asterisk) ? "multiply" : (lex->next == tk_slash) ? "divide" : "remainder";
  1368.         lex->advance();
  1369.         parse_prefix(block);
  1370.         write_operation(block, name, 2);
  1371.     }
  1372. }
  1373.  
  1374. void parser::parse_sum(script_engine::block * block)
  1375. {
  1376.     parse_product(block);
  1377.     while(lex->next == tk_tilde || lex->next == tk_plus || lex->next == tk_minus)
  1378.     {
  1379.         char const * name = (lex->next == tk_tilde) ? "concatenate" : (lex->next == tk_plus) ? "add" : "subtract";
  1380.         lex->advance();
  1381.         parse_product(block);
  1382.         write_operation(block, name, 2);
  1383.     }
  1384. }
  1385.  
  1386. void parser::parse_comparison(script_engine::block * block)
  1387. {
  1388.     parse_sum(block);
  1389.     switch(lex->next)
  1390.     {
  1391.         case tk_assign:
  1392.             throw parser_error("Did you mistake for \"==\"?");  //"\"==\"と間違えてませんか?// did you mistake for "==" ?
  1393.  
  1394.         case tk_e: //equals
  1395.         case tk_g: //greater-than
  1396.         case tk_ge://greater-than equals
  1397.         case tk_l: //less than
  1398.         case tk_le://less than equals
  1399.         case tk_ne://not equal
  1400.             token_kind op = lex->next;
  1401.             lex->advance();
  1402.             parse_sum(block);
  1403.             write_operation(block, "compare", 2);
  1404.             switch(op)
  1405.             {
  1406.                 case tk_e:
  1407.                     block->codes.push_back(code(lex->line, script_engine::pc_compare_e));
  1408.                     break;
  1409.                 case tk_g:
  1410.                     block->codes.push_back(code(lex->line, script_engine::pc_compare_g));
  1411.                     break;
  1412.                 case tk_ge:
  1413.                     block->codes.push_back(code(lex->line, script_engine::pc_compare_ge));
  1414.                     break;
  1415.                 case tk_l:
  1416.                     block->codes.push_back(code(lex->line, script_engine::pc_compare_l));
  1417.                     break;
  1418.                 case tk_le:
  1419.                     block->codes.push_back(code(lex->line, script_engine::pc_compare_le));
  1420.                     break;
  1421.                 case tk_ne:
  1422.                     block->codes.push_back(code(lex->line, script_engine::pc_compare_ne));
  1423.                     break;
  1424.             }
  1425.             break;
  1426.     }
  1427. }
  1428.  
  1429. void parser::parse_logic(script_engine::block * block)
  1430. {
  1431.     parse_comparison(block);
  1432.     while(lex->next == tk_and_then || lex->next == tk_or_else)
  1433.     {
  1434.         script_engine::command_kind cmd = (lex->next == tk_and_then) ? script_engine::pc_case_if_not : script_engine::pc_case_if;
  1435.         lex->advance();
  1436.  
  1437.         block->codes.push_back(code(lex->line, script_engine::pc_dup));
  1438.         block->codes.push_back(code(lex->line, script_engine::pc_case_begin));
  1439.         block->codes.push_back(code(lex->line, cmd));
  1440.         block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1441.  
  1442.         parse_comparison(block);
  1443.  
  1444.         block->codes.push_back(code(lex->line, script_engine::pc_case_end));
  1445.     }
  1446. }
  1447.  
  1448. void parser::parse_expression(script_engine::block * block)
  1449. {
  1450.     parse_logic(block);
  1451. }
  1452.  
  1453. int parser::parse_arguments(script_engine::block * block)
  1454. {
  1455.     int result = 0;
  1456.     if(lex->next == tk_open_par)
  1457.     {
  1458.         lex->advance();
  1459.         while(lex->next != tk_close_par)
  1460.         {
  1461.             ++result;
  1462.             parse_expression(block);
  1463.             if(lex->next != tk_comma) break;
  1464.             lex->advance();
  1465.         }
  1466.         if(lex->next != tk_close_par)
  1467.             throw parser_error("\")\" is required"); //"\")\"が必要です
  1468.         lex->advance();
  1469.     }
  1470.     return result;
  1471. }
  1472.  
  1473. void parser::parse_statements(script_engine::block * block)
  1474. {
  1475.     for( ; ; )
  1476.     {
  1477.         bool need_semicolon = true;
  1478.  
  1479.         if(lex->next == tk_word)
  1480.         {
  1481.             symbol * s = search(lex->word);
  1482.             if(s == NULL)
  1483.                 throw parser_error(lex->word + "は未定義の識別子です");
  1484.             lex->advance();
  1485.             switch(lex->next)
  1486.             {
  1487.                 case tk_assign:
  1488.                     lex->advance();
  1489.                     parse_expression(block);
  1490.                     block->codes.push_back(code(lex->line, script_engine::pc_assign, s->level, s->variable));
  1491.                     break;
  1492.  
  1493.                 case tk_open_bra:
  1494.                     block->codes.push_back(code(lex->line, script_engine::pc_push_variable_writable, s->level, s->variable));
  1495.                     lex->advance();
  1496.                     parse_expression(block);
  1497.                     if(lex->next != tk_close_bra)
  1498.                         throw parser_error("\"]\" is required"); //\"]\"が必要です
  1499.                     lex->advance();
  1500.                     write_operation(block, "index!", 2);
  1501.                     if(lex->next != tk_assign)
  1502.                         throw parser_error("\"=\"が必要です"); //\"=\"が必要です
  1503.                     lex->advance();
  1504.                     parse_expression(block);
  1505.                     block->codes.push_back(code(lex->line, script_engine::pc_assign_writable));
  1506.                     break;
  1507.  
  1508.                 case tk_add_assign:
  1509.                 case tk_subtract_assign:
  1510.                 case tk_multiply_assign:
  1511.                 case tk_divide_assign:
  1512.                 case tk_remainder_assign:
  1513.                 case tk_power_assign:
  1514.                     {
  1515.                         char const * f;
  1516.                         switch(lex->next)
  1517.                         {
  1518.                             case tk_add_assign:
  1519.                                 f = "add";
  1520.                                 break;
  1521.                             case tk_subtract_assign:
  1522.                                 f = "subtract";
  1523.                                 break;
  1524.                             case tk_multiply_assign:
  1525.                                 f = "multiply";
  1526.                                 break;
  1527.                             case tk_divide_assign:
  1528.                                 f = "divide";
  1529.                                 break;
  1530.                             case tk_remainder_assign:
  1531.                                 f = "remainder";
  1532.                                 break;
  1533.                             case tk_power_assign:
  1534.                                 f = "power";
  1535.                                 break;
  1536.                         }
  1537.                         lex->advance();
  1538.  
  1539.                         block->codes.push_back(code(lex->line, script_engine::pc_push_variable, s->level, s->variable));
  1540.  
  1541.                         parse_expression(block);
  1542.                         write_operation(block, f, 2);
  1543.  
  1544.                         block->codes.push_back(code(lex->line, script_engine::pc_assign, s->level, s->variable));
  1545.                     }
  1546.                     break;
  1547.  
  1548.                 case tk_inc:
  1549.                 case tk_dec:
  1550.                     {
  1551.                         char const * f = (lex->next == tk_inc) ? "successor" : "predecessor";
  1552.                         lex->advance();
  1553.  
  1554.                         block->codes.push_back(code(lex->line, script_engine::pc_push_variable, s->level, s->variable));
  1555.                         write_operation(block, f, 1);
  1556.                         block->codes.push_back(code(lex->line, script_engine::pc_assign, s->level, s->variable));
  1557.                     }
  1558.                     break;
  1559.                 default:
  1560.                     //関数, sub呼出し  //function sub call
  1561.                     if(s->sub == NULL)
  1562.                         throw parser_error("変数は関数やsubのようには呼べません");
  1563.  
  1564.                     int argc = parse_arguments(block);
  1565.  
  1566.                     if(argc != s->sub->arguments)
  1567.                         throw parser_error(s->sub->name + "wrong number of arguments"); //の引数の数が違います-translated
  1568.  
  1569.                     block->codes.push_back(code(lex->line, script_engine::pc_call, s->sub, argc));
  1570.             }
  1571.         }
  1572.         else if(lex->next == tk_LET || lex->next == tk_REAL)
  1573.         {
  1574.             lex->advance();
  1575.  
  1576.             if(lex->next != tk_word)
  1577.                 throw parser_error("identifiers are required"); //識別子が必要です -translated
  1578.  
  1579.             symbol * s = search(lex->word);
  1580.             lex->advance();
  1581.             if(lex->next == tk_assign)
  1582.             {
  1583.                 lex->advance();
  1584.  
  1585.                 parse_expression(block);
  1586.                 block->codes.push_back(code(lex->line, script_engine::pc_assign, s->level, s->variable));
  1587.             }
  1588.         }
  1589.         else if(lex->next == tk_LOCAL)
  1590.         {
  1591.             lex->advance();
  1592.             parse_inline_block(block, script_engine::bk_normal);
  1593.             need_semicolon = false;
  1594.         }
  1595.         else if(lex->next == tk_LOOP)
  1596.         {
  1597.             lex->advance();
  1598.             if(lex->next == tk_open_par)
  1599.             {
  1600.                 parse_parentheses(block);
  1601.                 int ip = block->codes.length;
  1602.                 block->codes.push_back(code(lex->line, script_engine::pc_loop_count));
  1603.                 parse_inline_block(block, script_engine::bk_loop);
  1604.                 block->codes.push_back(code(lex->line, script_engine::pc_loop_back, ip));
  1605.                 block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1606.             }
  1607.             else
  1608.             {
  1609.                 int ip = block->codes.length;
  1610.                 parse_inline_block(block, script_engine::bk_loop);
  1611.                 block->codes.push_back(code(lex->line, script_engine::pc_loop_back, ip));
  1612.             }
  1613.             need_semicolon = false;
  1614.         }
  1615.         else if(lex->next == tk_TIMES)
  1616.         {
  1617.             lex->advance();
  1618.             parse_parentheses(block);
  1619.             int ip = block->codes.length;
  1620.             if(lex->next == tk_LOOP)
  1621.             {
  1622.                 lex->advance();
  1623.             }
  1624.             block->codes.push_back(code(lex->line, script_engine::pc_loop_count));
  1625.             parse_inline_block(block, script_engine::bk_loop);
  1626.             block->codes.push_back(code(lex->line, script_engine::pc_loop_back, ip));
  1627.             block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1628.             need_semicolon = false;
  1629.         }
  1630.         else if(lex->next == tk_WHILE)
  1631.         {
  1632.             lex->advance();
  1633.             int ip = block->codes.length;
  1634.             parse_parentheses(block);
  1635.             if(lex->next == tk_LOOP)
  1636.             {
  1637.                 lex->advance();
  1638.             }
  1639.             block->codes.push_back(code(lex->line, script_engine::pc_loop_if));
  1640.             parse_inline_block(block, script_engine::bk_loop);
  1641.             block->codes.push_back(code(lex->line, script_engine::pc_loop_back, ip));
  1642.             need_semicolon = false;
  1643.         }
  1644.         else if(lex->next == tk_ASCENT || lex->next == tk_DESCENT)
  1645.         {
  1646.             bool back = lex->next == tk_DESCENT;
  1647.             lex->advance();
  1648.  
  1649.             if(lex->next != tk_open_par)
  1650.                 throw parser_error("\"(\" is required"); //"\"(\"が必要です" -translated
  1651.             lex->advance();
  1652.  
  1653.             if(lex->next == tk_LET || lex->next == tk_REAL)
  1654.             {
  1655.                 lex->advance();
  1656.             }
  1657.  
  1658.             if(lex->next != tk_word)
  1659.                 throw parser_error("identifier expected"); //"識別子が必要です" - translated
  1660.  
  1661.             std::string s = lex->word;
  1662.  
  1663.             lex->advance();
  1664.  
  1665.             if(lex->next != tk_IN)
  1666.                 throw parser_error("must be in"); //"inが必要です" - translated
  1667.             lex->advance();
  1668.  
  1669.             parse_expression(block);
  1670.  
  1671.             if(lex->next != tk_range)
  1672.                 throw parser_error("\"..\" must be required"); //"\"..\"が必要です" - translated
  1673.             lex->advance();
  1674.  
  1675.             parse_expression(block);
  1676.  
  1677.             if(lex->next != tk_close_par)
  1678.                 throw parser_error("\")\" is required"); //"\")\"が必要です" - translated
  1679.             lex->advance();
  1680.  
  1681.             if(lex->next == tk_LOOP)
  1682.             {
  1683.                 lex->advance();
  1684.             }
  1685.  
  1686.             if(!back)
  1687.             {
  1688.                 block->codes.push_back(code(lex->line, script_engine::pc_swap));
  1689.             }
  1690.  
  1691.             int ip = block->codes.length;
  1692.  
  1693.             block->codes.push_back(code(lex->line, script_engine::pc_dup2));
  1694.             write_operation(block, "compare", 2);
  1695.  
  1696.             block->codes.push_back(code(lex->line, back ? script_engine::pc_loop_descent : script_engine::pc_loop_ascent));
  1697.  
  1698.             if(back)
  1699.             {
  1700.                 write_operation(block, "predecessor", 1);
  1701.             }
  1702.  
  1703.             script_engine::block * b = engine->new_block(block->level + 1, script_engine::bk_loop);
  1704.             std::vector < std::string > counter;
  1705.             counter.push_back(s);
  1706.             parse_block(b, & counter, false);
  1707.             block->codes.push_back(code(lex->line, script_engine::pc_dup));
  1708.             block->codes.push_back(code(lex->line, script_engine::pc_call, b, 1));
  1709.  
  1710.             if(!back)
  1711.             {
  1712.                 write_operation(block, "successor", 1);
  1713.             }
  1714.  
  1715.             block->codes.push_back(code(lex->line, script_engine::pc_loop_back, ip));
  1716.             block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1717.             block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1718.  
  1719.             need_semicolon = false;
  1720.         }
  1721.         else if(lex->next == tk_IF)
  1722.         {
  1723.             lex->advance();
  1724.             block->codes.push_back(code(lex->line, script_engine::pc_case_begin));
  1725.  
  1726.             parse_parentheses(block);
  1727.             block->codes.push_back(code(lex->line, script_engine::pc_case_if_not));
  1728.             parse_inline_block(block, script_engine::bk_normal);
  1729.             while(lex->next == tk_ELSE)
  1730.             {
  1731.                 lex->advance();
  1732.                 block->codes.push_back(code(lex->line, script_engine::pc_case_next));
  1733.                 if(lex->next == tk_IF)
  1734.                 {
  1735.                     lex->advance();
  1736.                     parse_parentheses(block);
  1737.                     block->codes.push_back(code(lex->line, script_engine::pc_case_if_not));
  1738.                     parse_inline_block(block, script_engine::bk_normal);
  1739.                 }
  1740.                 else
  1741.                 {
  1742.                     parse_inline_block(block, script_engine::bk_normal);
  1743.                     break;
  1744.                 }
  1745.             }
  1746.  
  1747.             block->codes.push_back(code(lex->line, script_engine::pc_case_end));
  1748.             need_semicolon = false;
  1749.         }
  1750.         else if(lex->next == tk_ALTERNATIVE)
  1751.         {
  1752.             lex->advance();
  1753.             parse_parentheses(block);
  1754.             block->codes.push_back(code(lex->line, script_engine::pc_case_begin));
  1755.             while(lex->next == tk_CASE)
  1756.             {
  1757.                 lex->advance();
  1758.  
  1759.                 if(lex->next != tk_open_par)
  1760.                     throw parser_error("\"(\" is needed"); // \"(\"が必要です - translated
  1761.                 block->codes.push_back(code(lex->line, script_engine::pc_case_begin));
  1762.                 do
  1763.                 {
  1764.                     lex->advance();
  1765.  
  1766.                     block->codes.push_back(code(lex->line, script_engine::pc_dup));
  1767.                     parse_expression(block);
  1768.                     write_operation(block, "compare", 2);
  1769.                     block->codes.push_back(code(lex->line, script_engine::pc_compare_e));
  1770.                     block->codes.push_back(code(lex->line, script_engine::pc_dup));
  1771.                     block->codes.push_back(code(lex->line, script_engine::pc_case_if));
  1772.                     block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1773.  
  1774.                 }
  1775.                 while(lex->next == tk_comma);
  1776.                 block->codes.push_back(code(lex->line, script_engine::pc_push_value, value(engine->get_boolean_type(), false)));
  1777.                 block->codes.push_back(code(lex->line, script_engine::pc_case_end));
  1778.                 if(lex->next != tk_close_par)
  1779.                     throw parser_error("\")\" is needed"); // "\")\"が必要です" - translated
  1780.                 lex->advance();
  1781.  
  1782.                 block->codes.push_back(code(lex->line, script_engine::pc_case_if_not));
  1783.                 block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1784.                 parse_inline_block(block, script_engine::bk_normal);
  1785.                 block->codes.push_back(code(lex->line, script_engine::pc_case_next));
  1786.             }
  1787.             if(lex->next == tk_OTHERS)
  1788.             {
  1789.                 lex->advance();
  1790.                 block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1791.                 parse_inline_block(block, script_engine::bk_normal);
  1792.             }
  1793.             else
  1794.             {
  1795.                 block->codes.push_back(code(lex->line, script_engine::pc_pop));
  1796.             }
  1797.             block->codes.push_back(code(lex->line, script_engine::pc_case_end));
  1798.             need_semicolon = false;
  1799.         }
  1800.         else if(lex->next == tk_BREAK)
  1801.         {
  1802.             lex->advance();
  1803.             block->codes.push_back(code(lex->line, script_engine::pc_break_loop));
  1804.         }
  1805.         else if(lex->next == tk_RETURN)
  1806.         {
  1807.             lex->advance();
  1808.             switch(lex->next)
  1809.             {
  1810.                 case tk_end:
  1811.                 case tk_invalid:
  1812.                 case tk_semicolon:
  1813.                 case tk_close_cur:
  1814.                     break;
  1815.                 default:
  1816.                     parse_expression(block);
  1817.                     symbol * s = search_result();
  1818.                     if(s == NULL)
  1819.                         throw parser_error("ここはfunctionの中ではありません"); //function is not there?
  1820.  
  1821.                     block->codes.push_back(code(lex->line, script_engine::pc_assign, s->level, s->variable));
  1822.             }
  1823.             block->codes.push_back(code(lex->line, script_engine::pc_break_routine));
  1824.         }
  1825.         else if(lex->next == tk_YIELD)
  1826.         {
  1827.             lex->advance();
  1828.             block->codes.push_back(code(lex->line, script_engine::pc_yield));
  1829.         }
  1830.         else if(lex->next == tk_at || lex->next == tk_SUB || lex->next == tk_FUNCTION || lex->next == tk_TASK)
  1831.         {
  1832.             bool is_event = lex->next == tk_at;
  1833.  
  1834.             lex->advance();
  1835.             if(lex->next != tk_word)
  1836.                 throw parser_error("identifiers required"); // "識別子が必要です" - translated
  1837.  
  1838.             symbol * s = search(lex->word);
  1839.  
  1840.             if(is_event)
  1841.             {
  1842.                 if(s->sub->level > 1)
  1843.                     throw parser_error("イベントを深い階層に記述することはできません");
  1844.                 events[s->sub->name] = s->sub;
  1845.             }
  1846.  
  1847.             lex->advance();
  1848.  
  1849.             std::vector < std::string > args;
  1850.             if(s->sub->kind != script_engine::bk_sub)
  1851.             {
  1852.                 if(lex->next == tk_open_par)
  1853.                 {
  1854.                     lex->advance();
  1855.                     while(lex->next == tk_word || lex->next == tk_LET || lex->next == tk_REAL)
  1856.                     {
  1857.                         if(lex->next == tk_LET || lex->next == tk_REAL)
  1858.                         {
  1859.                             lex->advance();
  1860.                             if(lex->next != tk_word)
  1861.                                 throw parser_error("仮引数が必要です"); //arguments are required?
  1862.                         }
  1863.                         args.push_back(lex->word);
  1864.                         lex->advance();
  1865.                         if(lex->next != tk_comma)
  1866.                             break;
  1867.                         lex->advance();
  1868.                     }
  1869.                     if(lex->next != tk_close_par)
  1870.                         throw parser_error("\")\" is required"); // "\")\"が必要です" - translated
  1871.                     lex->advance();
  1872.                 }
  1873.             }
  1874.             else
  1875.             {
  1876.                 //互換性のため空の括弧だけ許す
  1877.                 if(lex->next == tk_open_par)
  1878.                 {
  1879.                     lex->advance();
  1880.                     if(lex->next != tk_close_par)
  1881.                         throw parser_error("\")\"が必要…というか\"(\"要らんです"); //")" must be "(" ?
  1882.                     lex->advance();
  1883.                 }
  1884.             }
  1885.             parse_block(s->sub, & args, s->sub->kind == script_engine::bk_function);
  1886.             need_semicolon = false;
  1887.         }
  1888.  
  1889.         //セミコロンが無いと継続しない //no continue without semicolon
  1890.         if(need_semicolon && lex->next != tk_semicolon)
  1891.             break;
  1892.  
  1893.         if(lex->next == tk_semicolon)
  1894.             lex->advance();
  1895.     }
  1896. }
  1897.  
  1898. void parser::parse_inline_block(script_engine::block * block, script_engine::block_kind kind)
  1899. {
  1900.     script_engine::block * b = engine->new_block(block->level + 1, kind);
  1901.     parse_block(b, NULL, false);
  1902.     block->codes.push_back(code(lex->line, script_engine::pc_call, b, 0));
  1903. }
  1904.  
  1905. void parser::parse_block(script_engine::block * block, std::vector < std::string > const * args, bool adding_result)
  1906. {
  1907.     if(lex->next != tk_open_cur)
  1908.         throw parser_error("\"{\" operator is required");  //"\"{\"が必要です"
  1909.     lex->advance();
  1910.  
  1911.     frame.push_back(scope(block->kind));
  1912.  
  1913.     scan_current_scope(block->level, args, adding_result);
  1914.  
  1915.     if(args != NULL)
  1916.     {
  1917.         for(unsigned i = 0; i < args->size(); ++i)
  1918.         {
  1919.             symbol * s = search((* args) [i]);
  1920.             block->codes.push_back(code(lex->line, script_engine::pc_assign, s->level, s->variable));
  1921.         }
  1922.     }
  1923.     parse_statements(block);
  1924.  
  1925.     frame.pop_back();
  1926.  
  1927.     if(lex->next != tk_close_cur)
  1928.         throw parser_error("\"}\" operator is required");  //"\"}\"が必要です"
  1929.     lex->advance();
  1930. }
  1931.  
  1932. /* script_engine */
  1933.  
  1934. script_engine::script_engine(script_type_manager * a_type_manager, std::string const & source, int funcc, function const * funcv) :
  1935.    type_manager(a_type_manager)
  1936.    {
  1937.        main_block = new_block(0, bk_normal);
  1938.  
  1939.        scanner s(source.c_str());
  1940.        parser p(this, & s, funcc, funcv);
  1941.  
  1942.        events = p.events;
  1943.  
  1944.        error = p.error;
  1945.        error_message = p.error_message;
  1946.        error_line = p.error_line;
  1947. }
  1948.  
  1949. /* script_machine */
  1950.  
  1951. script_machine::script_machine(script_engine * the_engine)
  1952. {
  1953.     assert(!the_engine->get_error());
  1954.     engine = the_engine;
  1955.  
  1956.     first_using_environment = NULL;
  1957.     last_using_environment = NULL;
  1958.     first_garbage_environment = NULL;
  1959.     last_garbage_environment = NULL;
  1960.  
  1961.     error = false;
  1962. }
  1963.  
  1964. script_machine::~script_machine()
  1965. {
  1966.     while(first_using_environment != NULL)
  1967.     {
  1968.         environment * object = first_using_environment;
  1969.         first_using_environment = first_using_environment->succ;
  1970.         delete object;
  1971.     }
  1972.  
  1973.     while(first_garbage_environment != NULL)
  1974.     {
  1975.         environment * object = first_garbage_environment;
  1976.         first_garbage_environment = first_garbage_environment->succ;
  1977.         delete object;
  1978.     }
  1979. }
  1980.  
  1981. script_machine::environment * script_machine::new_environment(environment * parent, script_engine::block * b)
  1982. {
  1983.     environment * result = NULL;
  1984.  
  1985.     if(first_garbage_environment != NULL)
  1986.     {
  1987.         // garbage collection //ごみ回収
  1988.         result = first_garbage_environment;
  1989.         first_garbage_environment = result->succ;
  1990.         * ((result->succ != NULL) ? & result->succ->pred : &last_garbage_environment) = result->pred;
  1991.     }
  1992.  
  1993.     if(result == NULL)
  1994.     {
  1995.         result = new environment;
  1996.     }
  1997.  
  1998.     result->parent = parent;
  1999.     result->ref_count = 1;
  2000.     result->sub = b;
  2001.     result->ip = 0;
  2002.     result->variables.release();
  2003.     result->stack.length = 0;
  2004.     result->has_result = false;
  2005.  
  2006.     // add to the list being used //使用中リストへの追加
  2007.     result->pred = last_using_environment;
  2008.     result->succ = NULL;
  2009.     * ((result->pred != NULL) ? & result->pred->succ : & first_using_environment) = result;
  2010.     last_using_environment = result;
  2011.  
  2012.     return result;
  2013. }
  2014.  
  2015. void script_machine::dispose_environment(environment * object)
  2016. {
  2017.     assert(object->ref_count == 0);
  2018.  
  2019.     //remove from the list in use //使用中リストからの削除
  2020.     * ((object->pred != NULL) ? & object->pred->succ : & first_using_environment) = object->succ;
  2021.     * ((object->succ != NULL) ? & object->succ->pred : & last_using_environment) = object->pred;
  2022.  
  2023.     //litter added to the list //ごみリストへの追加
  2024.     object->pred = last_garbage_environment;
  2025.     object->succ = NULL;
  2026.     * ((object->pred != NULL) ? & object->pred->succ : & first_garbage_environment) = object;
  2027.     last_garbage_environment = object;
  2028. }
  2029.  
  2030. void script_machine::run()
  2031. {
  2032.     assert(!error);
  2033.     if(first_using_environment == NULL)
  2034.     {
  2035.         error_line = -1;
  2036.         threads.clear();
  2037.         threads.push_back(new_environment(NULL, engine->main_block));
  2038.         current_thread_index = 0;
  2039.         finished = false;
  2040.         stopped = false;
  2041.         resuming = false;
  2042.  
  2043.         while(!finished)
  2044.         {
  2045.             advance();
  2046.         }
  2047.     }
  2048. }
  2049.  
  2050. void script_machine::resume()
  2051. {
  2052.     assert(!error);
  2053.     assert(stopped);
  2054.     stopped = false;
  2055.     finished = false;
  2056.     resuming = true;
  2057.     while(!finished)
  2058.     {
  2059.         advance();
  2060.     }
  2061. }
  2062.  
  2063. void script_machine::call(std::string event_name)
  2064. {
  2065.     assert(!error);
  2066.     assert(!stopped);
  2067.     if(engine->events.find(event_name) != engine->events.end())
  2068.     {
  2069.         run();  //念のため -//just in case
  2070.  
  2071.         script_engine::block * event = engine->events[event_name]; //event is not a keyword
  2072.         ++(threads[0]->ref_count);
  2073.         threads[0] = new_environment(threads[0], event);
  2074.         finished = false;
  2075.         while(!finished)
  2076.         {
  2077.             advance();
  2078.         }
  2079.     }
  2080. }
  2081.  
  2082. bool script_machine::has_event(std::string event_name)
  2083. {
  2084.     assert(!error);
  2085.     return engine->events.find(event_name) != engine->events.end();
  2086. }
  2087.  
  2088. int script_machine::get_current_line()
  2089. {
  2090.     environment * current = threads.at[current_thread_index];
  2091.     script_engine::code * c = & (current->sub->codes.at[current->ip]);
  2092.     return c->line;
  2093. }
  2094.  
  2095. void script_machine::advance()
  2096. {
  2097.     assert(current_thread_index < threads.length);
  2098.     environment * current = threads.at[current_thread_index];
  2099.  
  2100.     if(current->ip >= current->sub->codes.length)
  2101.     {
  2102.         environment * removing = current;
  2103.         current = current->parent;
  2104.         if(current == NULL)
  2105.         {
  2106.             finished = true;
  2107.         }
  2108.         else
  2109.         {
  2110.             threads[current_thread_index] = current;
  2111.  
  2112.             if(removing->has_result)
  2113.             {
  2114.                 assert(current != NULL && removing->variables.length > 0);
  2115.                 current->stack.push_back(removing->variables.at[0]);
  2116.             }
  2117.             else if(removing->sub->kind == script_engine::bk_microthread)
  2118.             {
  2119.                 threads.erase(threads.begin() + current_thread_index);
  2120.                 yield();
  2121.             }
  2122.  
  2123.             assert(removing->stack.length == 0);
  2124.  
  2125.             for(;;)
  2126.             {
  2127.                 --(removing->ref_count);
  2128.                 if(removing->ref_count > 0)
  2129.                     break;
  2130.                 environment * next = removing->parent;
  2131.                 dispose_environment(removing);
  2132.                 removing = next;
  2133.             }
  2134.         }
  2135.     }
  2136.     else
  2137.     {
  2138.         script_engine::code * c = & (current->sub->codes.at[current->ip]);
  2139.         error_line = c->line;   //ぉ
  2140.         ++(current->ip);
  2141.  
  2142.         switch(c->command)
  2143.         {
  2144.             case script_engine::pc_assign:
  2145.                 {
  2146.                     stack_t * stack = & current->stack;
  2147.                     assert(stack->length > 0);
  2148.                     for(environment * i = current; i != NULL; i = i->parent)
  2149.                     {
  2150.                         if(i->sub->level == c->level)
  2151.                         {
  2152.                             variables_t * vars = & i->variables;
  2153.                             if(vars->length <= c->variable)
  2154.                             {
  2155.                                 while(vars->capacity <= c->variable) vars->expand();
  2156.                                 vars->length = c->variable + 1;
  2157.                             }
  2158.                             value * dest = & (vars->at[c->variable]);
  2159.                             value * src = & stack->at[stack->length - 1];
  2160.                             if(dest->has_data() && dest->get_type() != src->get_type()
  2161.                                && !(dest->get_type()->get_kind() == type_data::tk_array
  2162.                                && src->get_type()->get_kind() == type_data::tk_array
  2163.                                && (dest->length_as_array() > 0 || src->length_as_array() > 0)))
  2164.                                    raise_error("代入によって型が変えられようとしました"); //type was changed by the assignment
  2165.                             * dest = * src;
  2166.                             stack->pop_back();
  2167.                             break;
  2168.                         }
  2169.                     }
  2170.                 }
  2171.                 break;
  2172.  
  2173.             case script_engine::pc_assign_writable:
  2174.                 {
  2175.                     stack_t * stack = & current->stack;
  2176.                     assert(stack->length >= 2);
  2177.                     value * dest = & stack->at[stack->length - 2];
  2178.                     value * src = & stack->at[stack->length - 1];
  2179.                     if(dest->has_data() && dest->get_type() != src->get_type()
  2180.                        && !(dest->get_type()->get_kind() == type_data::tk_array && src->get_type()->get_kind() == type_data::tk_array
  2181.                        && (dest->length_as_array() > 0 || src->length_as_array() > 0)))
  2182.                            raise_error("代入によって型が変えられようとしました");    //type was changed by the assignment
  2183.                     else
  2184.                     {
  2185.                         dest->overwrite(* src);
  2186.                         stack->length -= 2;
  2187.                     }
  2188.                 }
  2189.                 break;
  2190.  
  2191.             case script_engine::pc_break_loop:
  2192.             case script_engine::pc_break_routine:
  2193.                 for(environment * i = current; i != NULL; i = i->parent)
  2194.                 {
  2195.                     i->ip = i->sub->codes.length;
  2196.  
  2197.                     if(c->command == script_engine::pc_break_loop)
  2198.                     {
  2199.                         if(i->sub->kind == script_engine::bk_loop)
  2200.                         {
  2201.                             environment * e = i->parent;
  2202.                             assert(e != NULL);
  2203.                             do
  2204.                                 ++(e->ip);
  2205.                             while(e->sub->codes.at[e->ip - 1].command != script_engine::pc_loop_back);
  2206.                             break;
  2207.                         }
  2208.                     }
  2209.                     else
  2210.                     {
  2211.                         if(i->sub->kind == script_engine::bk_sub || i->sub->kind == script_engine::bk_function
  2212.                            || i->sub->kind == script_engine::bk_microthread)
  2213.                                break;
  2214.                         else if (i->sub->kind == script_engine::bk_loop)
  2215.                             i->parent->stack.clear(); /*kludge also a good place*/ /*小細工もいいところ*/
  2216.                     }
  2217.                 }
  2218.                 break;
  2219.  
  2220.             case script_engine::pc_call:
  2221.             case script_engine::pc_call_and_push_result:
  2222.                 {
  2223.                     stack_t * current_stack = & current->stack;
  2224.                     assert(current_stack->length >= c->arguments);
  2225.                     if(c->sub->func != NULL)
  2226.                     {
  2227.                         //native calls //ネイティブ呼び出し  
  2228.                         value * argv = & ((* current_stack).at[current_stack->length - c->arguments]);
  2229.                         value ret;
  2230.                         ret = c->sub->func(this, c->arguments, argv);
  2231.                         if(stopped)
  2232.                         {
  2233.                             --(current->ip);
  2234.                         }
  2235.                         else
  2236.                         {
  2237.                             resuming = false;
  2238.                             //removing the argument jams //詰まれた引数を削除  
  2239.                             //for(int i = 0; i < c->arguments; ++i) current_stack->pop_back();
  2240.                             current_stack->length -= c->arguments;
  2241.                             //return value //戻り値
  2242.                             if(c->command == script_engine::pc_call_and_push_result)
  2243.                                 current_stack->push_back(ret);
  2244.                         }
  2245.                     }
  2246.                     else if(c->sub->kind == script_engine::bk_microthread)
  2247.                     {
  2248.                         //launch microthread //マイクロスレッド起動
  2249.                         ++(current->ref_count);
  2250.                         environment * e = new_environment(current, c->sub);
  2251.                         ++current_thread_index;
  2252.                         threads.insert(threads.begin() + current_thread_index, e);
  2253.                         //transhipment of the argument //引数の積み替え
  2254.                         for(unsigned i = 0; i < c->arguments; ++i)
  2255.                         {
  2256.                             e->stack.push_back(current_stack->at[current_stack->length - 1]);
  2257.                             current_stack->pop_back();
  2258.                         }
  2259.                     }
  2260.                     else
  2261.                     {
  2262.                         //between script invocations //スクリプト間の呼び出し
  2263.  
  2264.                         ++(current->ref_count);
  2265.                         environment * e = new_environment(current, c->sub);
  2266.                         e->has_result = c->command == script_engine::pc_call_and_push_result;
  2267.                         threads[current_thread_index] = e;
  2268.                         //transshipment of the argument //引数の積み替え  
  2269.                         for(unsigned i = 0; i < c->arguments; ++i)
  2270.                         {
  2271.                             e->stack.push_back(current_stack->at[current_stack->length - 1]);
  2272.                             current_stack->pop_back();
  2273.                         }
  2274.                     }
  2275.                 }
  2276.                 break;
  2277.  
  2278.             case script_engine::pc_case_begin:
  2279.             case script_engine::pc_case_end:
  2280.                 break;
  2281.  
  2282.             case script_engine::pc_case_if:
  2283.             case script_engine::pc_case_if_not:
  2284.             case script_engine::pc_case_next:
  2285.                 {
  2286.                     bool exit = true;
  2287.                     if(c->command != script_engine::pc_case_next)
  2288.                     {
  2289.                         stack_t * current_stack = & current->stack;
  2290.                         exit = current_stack->at[current_stack->length - 1].as_boolean();
  2291.                         if(c->command == script_engine::pc_case_if_not)
  2292.                             exit = !exit;
  2293.                         current_stack->pop_back();
  2294.                     }
  2295.                     if(exit)
  2296.                     {
  2297.                         int nested = 0;
  2298.                         for( ; ; )
  2299.                         {
  2300.                             switch(current->sub->codes.at[current->ip].command)
  2301.                             {
  2302.                                 case script_engine::pc_case_begin:
  2303.                                     ++nested;
  2304.                                     break;
  2305.                                 case script_engine::pc_case_end:
  2306.                                     --nested;
  2307.                                     if(nested < 0)
  2308.                                         goto next;
  2309.                                     break;
  2310.                                 case script_engine::pc_case_next:
  2311.                                     if(nested == 0 && c->command != script_engine::pc_case_next)
  2312.                                     {
  2313.                                         ++(current->ip);
  2314.                                         goto next;
  2315.                                     }
  2316.                                     break;
  2317.                             }
  2318.                             ++(current->ip);
  2319.                         }
  2320.                     next:
  2321. #ifdef _MSC_VER
  2322.                         ;
  2323. #endif
  2324.                     }
  2325.                 }
  2326.                 break;
  2327.  
  2328.             case script_engine::pc_compare_e:
  2329.             case script_engine::pc_compare_g:
  2330.             case script_engine::pc_compare_ge:
  2331.             case script_engine::pc_compare_l:
  2332.             case script_engine::pc_compare_le:
  2333.             case script_engine::pc_compare_ne:
  2334.                 {
  2335.                     stack_t * stack = & current->stack;
  2336.                     value & t = stack->at[stack->length - 1];
  2337.                     long double r = t.as_real();
  2338.                     bool b;
  2339.                     switch(c->command)
  2340.                     {
  2341.                         case script_engine::pc_compare_e:
  2342.                             b = r == 0;
  2343.                             break;
  2344.                         case script_engine::pc_compare_g:
  2345.                             b = r > 0;
  2346.                             break;
  2347.                         case script_engine::pc_compare_ge:
  2348.                             b = r >= 0;
  2349.                             break;
  2350.                         case script_engine::pc_compare_l:
  2351.                             b = r < 0;
  2352.                             break;
  2353.                         case script_engine::pc_compare_le:
  2354.                             b = r <= 0;
  2355.                             break;
  2356.                         case script_engine::pc_compare_ne:
  2357.                             b = r != 0;
  2358.                             break;
  2359.                     }
  2360.                     t.set(engine->get_boolean_type(), b);
  2361.                 }
  2362.                 break;
  2363.  
  2364.             case script_engine::pc_dup:
  2365.                 {
  2366.                     stack_t * stack = & current->stack;
  2367.                     assert(stack->length > 0);
  2368.                     stack->push_back(stack->at[stack->length - 1]);
  2369.                 }
  2370.                 break;
  2371.  
  2372.             case script_engine::pc_dup2:
  2373.                 {
  2374.                     stack_t * stack = & current->stack;
  2375.                     int len = stack->length;
  2376.                     assert(len >= 2);
  2377.                     stack->push_back(stack->at[len - 2]);
  2378.                     stack->push_back(stack->at[len - 1]);
  2379.                 }
  2380.                 break;
  2381.  
  2382.             case script_engine::pc_loop_back:
  2383.                 current->ip = c->ip;
  2384.                 break;
  2385.  
  2386.             case script_engine::pc_loop_ascent:
  2387.                 {
  2388.                     stack_t * stack = & current->stack;
  2389.                     value * i = & stack->at[stack->length - 1];
  2390.                     if(i->as_real() <= 0)
  2391.                     {
  2392.                         do
  2393.                             ++(current->ip);
  2394.                         while(current->sub->codes.at[current->ip - 1].command != script_engine::pc_loop_back);
  2395.                     }
  2396.                     current->stack.pop_back();
  2397.                 }
  2398.                 break;
  2399.  
  2400.             case script_engine::pc_loop_descent:
  2401.                 {
  2402.                     stack_t * stack = & current->stack;
  2403.                     value * i = & stack->at[stack->length - 1];
  2404.                     if(i->as_real() >= 0)
  2405.                     {
  2406.                         do
  2407.                             ++(current->ip);
  2408.                         while(current->sub->codes.at[current->ip - 1].command != script_engine::pc_loop_back);
  2409.                     }
  2410.                     current->stack.pop_back();
  2411.                 }
  2412.                 break;
  2413.  
  2414.             case script_engine::pc_loop_count:
  2415.                 {
  2416.                     stack_t * stack = & current->stack;
  2417.                     value * i = & stack->at[stack->length - 1];
  2418.                     assert(i->get_type()->get_kind() == type_data::tk_real);
  2419.                     long double r = i->as_real();
  2420.                     if(r > 0)
  2421.                         i->set(engine->get_real_type(), r - 1);
  2422.                     else
  2423.                     {
  2424.                         do
  2425.                             ++(current->ip);
  2426.                         while(current->sub->codes.at[current->ip - 1].command != script_engine::pc_loop_back);
  2427.                     }
  2428.                 }
  2429.                 break;
  2430.  
  2431.             case script_engine::pc_loop_if:
  2432.                 {
  2433.                     stack_t * stack = & current->stack;
  2434.                     bool c = stack->at[stack->length - 1].as_boolean();
  2435.                     current->stack.pop_back();
  2436.                     if(!c)
  2437.                     {
  2438.                         do
  2439.                             ++(current->ip);
  2440.                         while(current->sub->codes.at[current->ip - 1].command != script_engine::pc_loop_back);
  2441.                     }
  2442.                 }
  2443.                 break;
  2444.  
  2445.             case script_engine::pc_pop:
  2446.                 assert(current->stack.length > 0);
  2447.                 current->stack.pop_back();
  2448.                 break;
  2449.  
  2450.             case script_engine::pc_push_value:
  2451.                 current->stack.push_back(c->data);
  2452.                 break;
  2453.  
  2454.             case script_engine::pc_push_variable:
  2455.             case script_engine::pc_push_variable_writable:
  2456.                 for(environment * i = current; i != NULL; i = i->parent)
  2457.                 {
  2458.                     if(i->sub->level == c->level)
  2459.                     {
  2460.                         variables_t * vars = & i->variables;
  2461.                         if(vars->length <= c->variable || !((* vars).at[c->variable].has_data()))
  2462.                             raise_error("一回も代入していない変数を使おうとしました"); //we do not use a variable subsitution at once?
  2463.                         else
  2464.                         {
  2465.                             value * var = & (* vars).at[c->variable];
  2466.                             if(c->command == script_engine::pc_push_variable_writable)
  2467.                                 var->unique();
  2468.                             current->stack.push_back(* var);
  2469.                         }
  2470.                         break;
  2471.                     }
  2472.                 }
  2473.                 break;
  2474.  
  2475.             case script_engine::pc_swap:
  2476.                 {
  2477.                     int len = current->stack.length;
  2478.                     assert(len >= 2);
  2479.                     value t = current->stack[len - 1];
  2480.                     current->stack[len - 1] = current->stack[len - 2];
  2481.                     current->stack[len - 2] = t;
  2482.                 }
  2483.                 break;
  2484.  
  2485.             case script_engine::pc_yield:
  2486.                 yield();
  2487.                 break;
  2488.  
  2489.             default:
  2490.                 assert(false);
  2491.         }
  2492.     }
  2493. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement