summaryrefslogblamecommitdiff
path: root/src/ast/script.hpp
blob: 74b11e172e551193a912f87f1579880175c3493b (plain) (tree)























                                                                                 
                         



              
             
 
                








                            











                                                                    



                                   


                                                                                    
















































                                                                                                                                                                                   
                     
                  
                   
#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/span.hpp"


namespace tmwa
{
namespace ast
{
namespace script
{
    using io::Spanned;

    struct ScriptBody
    {
        RString braced_body;
        io::LineSpan span;
    };

    struct ScriptOptions
    {
        // don't require a label at the beginning
        bool implicit_start = false;
        // label to generate at the beginning if not already present
        RString default_label;
        // beginning must be only 'end;'
        bool no_start;
        // don't requite an 'end;' at the end
        bool implicit_end = false;
        // forbid newlines anywhere between { and }
        bool one_line = false;
        // forbid the OnTouch event
        bool no_touch = false;
        // forbid all events
        bool no_event = false;
    };

    Result<ScriptBody> parse_script_body(io::LineCharReader& lr, ScriptOptions opt);

    /*
    (-- 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 script
} // namespace ast
} // namespace tmwa