From 769e8ac9c17779a15492d7fcfc1931c014670c2d Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Tue, 25 Mar 2014 21:46:21 -0700 Subject: Add deprecation warnings for script syntax changes --- src/map/itemdb.cpp | 4 ++-- src/map/magic-v2.cpp | 2 +- src/map/npc.cpp | 4 ++-- src/map/script.cpp | 43 ++++++++++++++++++++++++++++++++++++++----- src/map/script.hpp | 7 ++++--- 5 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/map/itemdb.cpp b/src/map/itemdb.cpp index b1a1a30..52a14aa 100644 --- a/src/map/itemdb.cpp +++ b/src/map/itemdb.cpp @@ -227,12 +227,12 @@ bool itemdb_readdb(ZString filename) if (!tail_part) continue; - id->use_script = parse_script(tail_part, lines); + id->use_script = parse_script(tail_part, lines, true); tail_part = tail_part.xislice_t(std::find(tail_part.begin() + 1, tail_part.end(), '{')); if (!tail_part) continue; - id->equip_script = parse_script(tail_part, lines); + id->equip_script = parse_script(tail_part, lines, true); } PRINTF("read %s done (count=%d)\n", filename, ln); } diff --git a/src/map/magic-v2.cpp b/src/map/magic-v2.cpp index 9fb5001..1fad61d 100644 --- a/src/map/magic-v2.cpp +++ b/src/map/magic-v2.cpp @@ -762,7 +762,7 @@ namespace magic_v2 if (s._list[1]._type != sexpr::STRING) return fail(s._list[1], "not string"); ZString body = s._list[1]._str; - std::unique_ptr script = parse_script(body, s._list[1]._span.begin.line); + std::unique_ptr script = parse_script(body, s._list[1]._span.begin.line, true); if (!script) return fail(s._list[1], "script does not compile"); out = new_effect(EFFECT::SCRIPT); diff --git a/src/map/npc.cpp b/src/map/npc.cpp index 42ec4fa..dd75691 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -1228,7 +1228,7 @@ int npc_parse_script(XString w1, XString w2, NpcName w3, ZString w4, srcbuf += line; srcbuf += '\n'; } - script = parse_script(AString(srcbuf), startline); + script = parse_script(AString(srcbuf), startline, false); if (script == NULL) // script parse error? return 1; @@ -1419,7 +1419,7 @@ int npc_parse_function(XString, XString, XString w3, ZString, srcbuf += line; srcbuf += '\n'; } - std::unique_ptr script = parse_script(AString(srcbuf), startline); + std::unique_ptr script = parse_script(AString(srcbuf), startline, false); if (script == NULL) { // script parse error? diff --git a/src/map/script.cpp b/src/map/script.cpp index 75f6809..cbb6d96 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include "../compat/fun.hpp" #include "../strings/mstring.hpp" @@ -489,6 +491,7 @@ ZString::iterator ScriptBuffer::parse_subexpr(ZString::iterator p, int limit) ZString::iterator tmpp = skip_space(p + 1); if (*tmpp == ';' || *tmpp == ',') { + --script_errors; disp_error_message("deprecated: implicit 'next statement' label", p); add_scriptl(&LABEL_NEXTLINE_); p++; return p; @@ -611,7 +614,7 @@ ZString::iterator ScriptBuffer::parse_expr(ZString::iterator p) * 行の解析 *------------------------------------------ */ -ZString::iterator ScriptBuffer::parse_line(ZString::iterator p) +ZString::iterator ScriptBuffer::parse_line(ZString::iterator p, bool *can_step) { int i = 0; ZString::iterator plist[128]; @@ -634,6 +637,20 @@ ZString::iterator ScriptBuffer::parse_line(ZString::iterator p) // exit(0); } + { + static + std::set terminators = + { + "goto", + "return", + "close", + "menu", + "end", + "mapexit", + }; + *can_step = terminators.count(cmd->strs) == 0; + } + add_scriptc(ByteCode::ARG); while (*p && *p != ';' && i < 128) { @@ -726,10 +743,10 @@ bool read_constdb(ZString filename) return rv; } -std::unique_ptr parse_script(ZString src, int line) +std::unique_ptr parse_script(ZString src, int line, bool implicit_end) { auto script_buf = make_unique(); - script_buf->parse_script(src, line); + script_buf->parse_script(src, line, implicit_end); return std::move(script_buf); } @@ -737,7 +754,7 @@ std::unique_ptr parse_script(ZString src, int line) * スクリプトの解析 *------------------------------------------ */ -void ScriptBuffer::parse_script(ZString src, int line) +void ScriptBuffer::parse_script(ZString src, int line, bool implicit_end) { static int first = 1; @@ -767,6 +784,8 @@ void ScriptBuffer::parse_script(ZString src, int line) startptr = src; startline = line; + bool can_step = true; + ZString::iterator p = src.begin(); p = skip_space(p); if (*p != '{') @@ -779,6 +798,12 @@ void ScriptBuffer::parse_script(ZString src, int line) p = skip_space(p); if (*skip_space(skip_word(p)) == ':') { + if (can_step) + { + --script_errors; disp_error_message("deprecated: implicit fallthrough", p); + } + can_step = true; + ZString::iterator tmpp = skip_word(p); XString str(&*p, &*tmpp, nullptr); str_data_t *ld = add_strp(str); @@ -797,8 +822,12 @@ void ScriptBuffer::parse_script(ZString src, int line) continue; } + if (!can_step) + { + --script_errors; disp_error_message("deprecated: unreachable statement", p); + } // 他は全部一緒くた - p = parse_line(p); + p = parse_line(p, &can_step); p = skip_space(p); add_scriptc(ByteCode::EOL); @@ -808,6 +837,10 @@ void ScriptBuffer::parse_script(ZString src, int line) LABEL_NEXTLINE_.label_ = -1; } + if (can_step && !implicit_end) + { + --script_errors; disp_error_message("deprecated: implicit end", p); + } add_scriptc(ByteCode::NOP); // resolve the unknown labels diff --git a/src/map/script.hpp b/src/map/script.hpp index 6cf40b0..8c072b3 100644 --- a/src/map/script.hpp +++ b/src/map/script.hpp @@ -35,8 +35,8 @@ public: ZSit parse_simpleexpr(ZSit p); ZSit parse_subexpr(ZSit p, int limit); ZSit parse_expr(ZSit p); - ZSit parse_line(ZSit p); - void parse_script(ZString src, int line); + ZSit parse_line(ZSit p, bool *canstep); + void parse_script(ZString src, int line, bool implicit_end); // consumption methods used only by script.cpp ByteCode operator[](size_t i) const { return script_buf[i]; } @@ -136,7 +136,8 @@ public: int defsp, new_defsp; }; -std::unique_ptr parse_script(ZString, int); +std::unique_ptr parse_script(ZString, int, bool implicit_end); + struct argrec_t { ZString name; -- cgit v1.2.3-60-g2f50