diff options
Diffstat (limited to 'src/ast/script.hpp')
-rw-r--r-- | src/ast/script.hpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/ast/script.hpp b/src/ast/script.hpp new file mode 100644 index 0000000..59e53f0 --- /dev/null +++ b/src/ast/script.hpp @@ -0,0 +1,94 @@ +#pragma once +// ast/script.hpp - Structure of tmwa-script +// +// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com> +// +// This file is part of The Mana World (Athena server) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +#include "fwd.hpp" + +#include "../compat/result.hpp" + +#include "../io/line.hpp" + + +namespace tmwa +{ +namespace script +{ +namespace parse +{ + using io::Spanned; + + struct ScriptBody + { + RString braced_body; + io::LineSpan span; + }; + + Result<ScriptBody> parse_script_body(io::LineCharReader& lr); + + /* + (-- First bare-body-chunk only allowed for npcs, items, magic, functions. + It is not allowed for events. Basically it's an implicit label at times. + Last normal-lines is only permitted on item and magic scripts. --) + { script-body }: "{" bare-body-chunk? body-chunk* normal-lines? "}" + body-chunk: (comment* labelname ":")+ bare-body-chunk + bare-body-chunk: normal-lines terminator-line + normal-lines: normal-line* + any-line: normal-line + any-line: terminator-line + normal-line: "if" "(" expr ")" any-line + normal-line: normal-command ((expr ",")* expr)? ";" + terminator-line: "menu" (expr, labelname)* expr, labelname ";" + terminator-line: "goto" labelname ";" + terminator-line: terminator ((expr ",")* expr)? ";" + terminator: "return" + terminator: "close" + terminator: "end" + terminator: "mapexit" + terminator: "shop" + + expr: subexpr_-1 + subexpr_N: ("+" | "-" | "!" | "~") subexpr_7 + subexpr_N: simple-expr (op_M subexpr_M | "(" ((expr ",")+ expr)? ")")* if N < M; function call only if N < 8 and preceding simple-expr (op sub)* is a known function + op_0: "||" + op_1: "&&" + op_2: "==" + op_2: "!=" + op_2: ">=" + op_2: ">" + op_2: "<=" + op_2: "<" + op_3: "^" + op_4: "|" + op_5: "&" + op_5: ">>" + op_5: "<<" + op_6: "+" + op_6: "-" + op_7: "*" + op_7: "/" + op_7: "%" + simple-expr: "(" expr ")" + simple-expr: integer + simple-expr: string + simple-expr: variable ("[" expr "]")? + simple-expr: function // no longer command/label though + */ +} // namespace parse +} // namespace script +} // namespace tmwa |