summaryrefslogtreecommitdiff
path: root/src/spell-convert/parser.ypp
diff options
context:
space:
mode:
Diffstat (limited to 'src/spell-convert/parser.ypp')
-rw-r--r--src/spell-convert/parser.ypp902
1 files changed, 0 insertions, 902 deletions
diff --git a/src/spell-convert/parser.ypp b/src/spell-convert/parser.ypp
deleted file mode 100644
index 8a40543..0000000
--- a/src/spell-convert/parser.ypp
+++ /dev/null
@@ -1,902 +0,0 @@
-%code requires
-{
-/* vim: set ft=yacc: */
-// magic-interpreter-parser.ypp - Old magic tokenizer
-//
-// Copyright © 2004-2011 The Mana World Development Team
-// Copyright © 2011-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 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 General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-#include "../strings/rstring.hpp"
-
-#include "ast.hpp"
-
-#undef YYERROR_VERBOSE
-#define YYERROR_VERBOSE 1
-} // %code requires
-
-%code
-{
-//#include "parser.hpp"
-#include "lexer.hpp"
-
-#include "../io/cxxstdio.hpp"
-
-#include "../sexpr/lexer.hpp"
-
-void yyerror(const char *msg) { FPRINTF(stderr, "Fatal: %s\n", msg); abort(); }
-} // %code
-
-%name-prefix "spell_converter"
-
-%union
-{
- RString *s;
- std::vector<RString> *vs;
- Effect *e;
- std::deque<Effect *> *ve;
- SpellDef *spelldef;
- SpellArg *spellarg;
- TopLevel *top;
- Expression *expr;
- std::vector<Expression *> *vx;
- Location *loc;
- Item *it;
- std::vector<Item *> *vit;
- Assignment *a;
- std::vector<Assignment *> *va;
- SpellBod *b;
- std::vector<SpellBod *> *vb;
- SpellGuard *g;
- std::vector<SpellGuard *> *vg;
-} // %union
-
-%expect 7
-
-%token <s> INT
-%token <s> STRING
-%token <s> ID
-%token <s> DIR
-
-%token '='
-%token '<'
-%token '>'
-%token '+'
-%token '-'
-%token '*'
-%token '/'
-%token '%'
-%token '@'
-%token ','
-%token '.'
-%token ':'
-%token ';'
-%token '|'
-%token '['
-%token ']'
-%token '&'
-%token '^'
-
-%token CONST
-%token PROCEDURE
-%token CALL
-%token SILENT
-%token LOCAL
-%token NONMAGIC
-%token SHL
-%token SHR
-%token EQ
-%token NEQ
-%token GTE
-%token LTE
-%token ANDAND
-%token OROR
-%token <s> SCRIPT_DATA
-%token TO
-%token TOWARDS
-%token TELEPORT_ANCHOR
-%token SPELL
-%token LET
-%token IN
-%token END
-%token DARROW
-%token STRING_TY
-%token REQUIRE
-%token CATALYSTS
-%token COMPONENTS
-%token MANA
-%token CASTTIME
-%token SKIP
-%token ABORT
-%token BREAK
-%token EFFECT_
-%token ATEND
-%token ATTRIGGER
-%token PC_F
-%token NPC_F
-%token MOB_F
-%token ENTITY_F
-%token TARGET_F
-%token IF
-%token THEN
-%token ELSE
-%token FOREACH
-%token FOR
-%token DO
-%token SLEEP
-
-%type <s> value
-%type <loc> location
-%type <expr> area
-%type <vx> arg_list
-%type <vx> arg_list_ne
-%type <va> defs
-%type <spelldef> spelldef
-%type <spellarg> argopt
-%type <a> def
-%type <vb> spellbody_list
-%type <b> spellbody
-%type <g> spellguard
-%type <vg> spellguard_list
-%type <g> prereq
-%type <it> item
-%type <vit> items
-%type <vit> item_list
-%type <s> item_name
-%type <s> selection;
-%type <e> effect
-%type <ve> effect_list
-%type <ve> maybe_trigger
-%type <ve> maybe_end
-%type <vs> spell_flags;
-
-%type <expr> expr
-%type <s> arg_ty
-%type <vs> proc_formals_list
-%type <vs> proc_formals_list_ne
-
-%type <top> spellconf_option
-
-%left OROR
-%left ANDAND
-%left '<' '>' GTE LTE NEQ EQ
-%left '+' '-'
-%left '*' '/' '%'
-%left SHL SHR '&' '^' '|'
-%right '='
-%left OR
-%left DARROW
-%left '.'
-
-%%
-
-spellconf
-
-: /* empty */
-
-| spellconf semicolons spellconf_option
-{
- $3->dump();
-}
-
-;
-
-
-semicolons
-
-: /* empty */
-
-| semicolons ';'
-
-;
-
-
-proc_formals_list
-
-: /* empty */
-{
- $$ = new std::vector<RString>();
-}
-
-| proc_formals_list_ne
-{
- $$ = $1;
-}
-
-;
-
-
-proc_formals_list_ne
-
-: ID
-{
- $$ = new std::vector<RString>();
- $$->push_back(*$1);
-}
-
-| proc_formals_list_ne ',' ID
-{
- $$ = $1;
- $$->push_back(*$3);
-}
-
-;
-
-
-spellconf_option
-
-: ID '=' expr
-{
- $$ = new Assignment{*$1, $3};
-}
-
-| CONST ID '=' expr
-{
- $$ = new Constant{*$2, $4};
-}
-
-| TELEPORT_ANCHOR ID ':' expr '=' expr
-{
- $$ = new Teleport{*$2, $4, $6};
-}
-
-| PROCEDURE ID '(' proc_formals_list ')' '=' effect_list
-{
- $$ = new Procedure{*$2, $4, $7};
-}
-
-| spell_flags SPELL ID argopt ':' expr '=' spelldef
-{
- $$ = new Spell{$1, *$3, $4, $6, $8};
-}
-
-;
-
-
-spell_flags
-
-: /* empty */
-{
- $$ = new std::vector<RString>();
-}
-
-| spell_flags LOCAL
-{
- $$ = $1;
- $$->push_back("LOCAL");
-}
-
-| spell_flags NONMAGIC
-{
- $$ = $1;
- $$->push_back("NONMAGIC");
-}
-
-| spell_flags SILENT
-{
- $$ = $1;
- $$->push_back("SILENT");
-}
-
-;
-
-
-argopt
-
-: /* empty */
-{
- $$ = new SpellArg{};
-}
-
-| '(' ID ':' arg_ty ')'
-{
- $$ = new SpellArg{*$2, *$4};
-}
-
-;
-
-
-arg_ty
-
-: PC_F
-{
- $$ = new RString("PC");
-}
-
-| STRING_TY
-{
- $$ = new RString("STRING");
-}
-
-;
-
-
-value
-
-: DIR
-{
- $$ = $1;
-}
-
-| INT
-{
- $$ = $1;
-}
-
-| STRING
-{
- $$ = $1;
-}
-
-;
-
-
-expr
-
-: value
-{
- $$ = new SimpleExpr{*$1};
-}
-
-| ID
-{
- $$ = new SimpleExpr{*$1};
-}
-
-| area
-{
- $$ = $1;
-}
-
-| expr '+' expr
-{
- $$ = new BinExpr{$1, "+", $3};
-}
-
-| expr '-' expr
-{
- $$ = new BinExpr{$1, "-", $3};
-}
-
-| expr '*' expr
-{
- $$ = new BinExpr{$1, "*", $3};
-}
-
-| expr '%' expr
-{
- $$ = new BinExpr{$1, "%", $3};
-}
-
-| expr '/' expr
-{
- $$ = new BinExpr{$1, "/", $3};
-}
-
-| expr '<' expr
-{
- $$ = new BinExpr{$1, "<", $3};
-}
-
-| expr '>' expr
-{
- $$ = new BinExpr{$1, ">", $3};
-}
-
-| expr '&' expr
-{
- $$ = new BinExpr{$1, "&", $3};
-}
-
-| expr '^' expr
-{
- $$ = new BinExpr{$1, "^", $3};
-}
-
-| expr '|' expr
-{
- $$ = new BinExpr{$1, "|", $3};
-}
-
-| expr SHL expr
-{
- $$ = new BinExpr{$1, "<<", $3};
-}
-
-| expr SHR expr
-{
- $$ = new BinExpr{$1, ">>", $3};
-}
-
-| expr LTE expr
-{
- $$ = new BinExpr{$1, "<=", $3};
-}
-
-| expr GTE expr
-{
- $$ = new BinExpr{$1, ">=", $3};
-}
-
-| expr ANDAND expr
-{
- $$ = new BinExpr{$1, "&&", $3};
-}
-
-| expr OROR expr
-{
- $$ = new BinExpr{$1, "||", $3};
-}
-
-| expr EQ expr
-{
- $$ = new BinExpr{$1, "==", $3};
-}
-
-| expr '=' expr
-{
- // convert to ==
- $$ = new BinExpr{$1, "==", $3};
-}
-
-| expr NEQ expr
-{
- $$ = new BinExpr{$1, "!=", $3};
-}
-
-| ID '(' arg_list ')'
-{
- $$ = new CallExpr{*$1, $3};
-}
-
-| '(' expr ')'
-{
- $$ = $2;
-}
-
-| expr '.' ID
-{
- $$ = new BinExpr{$1, ".", new SimpleExpr(*$3)};
-}
-
-;
-
-
-arg_list
-
-: /* empty */
-{
- $$ = new std::vector<Expression *>();
-}
-
-| arg_list_ne
-{
- $$ = $1;
-}
-
-;
-
-
-arg_list_ne
-
-: expr
-{
- $$ = new std::vector<Expression *>();
- $$->push_back($1);
-}
-
-| arg_list_ne ',' expr
-{
- $$ = $1;
- $$->push_back($3);
-}
-
-;
-
-
-location
-
-: '@' '(' expr ',' expr ',' expr ')'
-{
- $$ = new Location{$3, $5, $7};
-}
-
-;
-
-
-area
-
-: location
-{
- $$ = new AreaLoc{$1};
-}
-
-| location '@' '+' '(' expr ',' expr ')'
-{
- $$ = new AreaRect{$1, $5, $7};
-}
-
-| location TOWARDS expr ':' '(' expr ',' expr ')'
-{
- $$ = new AreaBar{$1, $3, $6, $8};
-}
-
-;
-
-
-spelldef
-
-: spellbody_list
-{
- $$ = new SpellDef{new std::vector<Assignment *>{}, $1};
-}
-
-| LET defs IN spellbody_list
-{
- $$ = new SpellDef{$2, $4};
-}
-
-;
-
-
-defs
-
-: semicolons
-{
- $$ = new std::vector<Assignment *>();
-}
-
-| defs def semicolons
-{
- $$ = $1;
- $$->push_back($2);
-}
-
-;
-
-
-def
-
-: ID '=' expr
-{
- $$ = new Assignment{*$1, $3};
-}
-
-;
-
-
-spellbody_list
-
-: spellbody
-{
- $$ = new std::vector<SpellBod *>();
- $$->push_back($1);
-}
-
-| spellbody_list '|' spellbody
-{
- $$ = $1;
- $$->push_back($3);
-}
-
-;
-
-
-spellbody
-
-: spellguard DARROW spellbody
-{
- $$ = new SpellBodGuarded{$1, $3};
-}
-
-| '(' spellbody_list ')'
-{
- $$ = new SpellBodList{$2};
-}
-
-| EFFECT_ effect_list maybe_trigger maybe_end
-{
- $$ = new SpellBodEffect{$2, $3, $4};
-}
-
-;
-
-
-maybe_trigger
-
-: /* empty */
-{
- $$ = nullptr;
-}
-
-| ATTRIGGER effect_list
-{
- $$ = $2;
-}
-
-;
-
-
-maybe_end
-
-: /* empty */
-{
- $$ = nullptr;
-}
-
-| ATEND effect_list
-{
- $$ = $2;
-}
-
-;
-
-
-spellguard
-
-: prereq
-{
- $$ = $1;
-}
-
-| spellguard OR spellguard
-{
- $$ = new SpellGuardOr($1, $3);
-}
-
-| '(' spellguard_list ')'
-{
- $$ = new SpellGuardList{$2};
-}
-
-;
-
-
-spellguard_list
-
-: spellguard
-{
- $$ = new std::vector<SpellGuard *>();
- $$->push_back($1);
-}
-
-| spellguard_list ',' spellguard
-{
- $$ = $1;
- $$->push_back($3);
-}
-
-;
-
-
-prereq
-
-: REQUIRE expr
-{
- $$ = new SpellGuardRequire{$2};
-}
-
-| CATALYSTS items
-{
- $$ = new SpellGuardCatalysts{$2};
-}
-
-| COMPONENTS items
-{
- $$ = new SpellGuardComponents{$2};
-}
-
-| MANA expr
-{
- $$ = new SpellGuardMana{$2};
-}
-
-| CASTTIME expr
-{
- $$ = new SpellGuardCasttime{$2};
-}
-
-;
-
-
-items
-
-: '[' item_list ']'
-{
- $$ = $2;
-}
-
-;
-
-
-item_list
-
-: item
-{
- $$ = new std::vector<Item *>();
- $$->push_back($1);
-}
-
-| item_list ',' item
-{
- $$ = $1;
- $$->push_back($3);
-}
-
-;
-
-
-item
-
-: INT '*' item_name
-{
- $$ = new Item{*$1, *$3};
-}
-
-| item_name
-{
- $$ = new Item{RString(), *$1};
-}
-
-;
-
-
-item_name
-
-: STRING
-{
- $$ = $1;
-}
-
-| INT
-{
- $$ = $1;
-}
-
-;
-
-
-selection
-
-: PC_F
-{
- $$ = new RString{"PC"};
-}
-
-| MOB_F
-{
- $$ = new RString{"MOB"};
-}
-
-| ENTITY_F
-{
- $$ = new RString{"ENTITY"};
-}
-
-| SPELL
-{
- $$ = new RString{"SPELL"};
-}
-
-| TARGET_F
-{
- $$ = new RString{"TARGET"};
-}
-
-| NPC_F
-{
- $$ = new RString{"NPC"};
-}
-
-;
-
-
-effect
-
-: '(' effect_list ')'
-{
- $$ = new EffectList{$2};
-}
-
-| SKIP ';'
-{
- $$ = new SimpleEffect{"SKIP"};
-}
-
-| ABORT ';'
-{
- $$ = new SimpleEffect{"ABORT"};
-}
-
-| END ';'
-{
- $$ = new SimpleEffect{"END"};
-}
-
-| BREAK ';'
-{
- $$ = new SimpleEffect{"BREAK"};
-}
-
-| ID '=' expr ';'
-{
- $$ = new Assignment(*$1, $3);
-}
-
-| FOREACH selection ID IN expr DO effect
-{
- $$ = new ForeachEffect{*$2, *$3, $5, $7};
-}
-
-| FOR ID '=' expr TO expr DO effect
-{
- $$ = new ForEffect{*$2, $4, $6, $8};
-}
-
-| IF expr THEN effect ELSE effect
-{
- $$ = new IfEffect{$2, $4, $6};
-}
-
-| IF expr THEN effect
-{
- $$ = new IfEffect{$2, $4};
-}
-
-| SLEEP expr ';'
-{
- $$ = new SleepEffect{$2};
-}
-
-| ID '(' arg_list ')' ';'
-{
- $$ = new CallExpr{*$1, $3};
-}
-
-| SCRIPT_DATA
-{
- AString tmp = sexpr::escape(*$1);
- $$ = new ScriptEffect{RString(tmp)};
-}
-
-| CALL ID '(' arg_list ')' ';'
-{
- $$ = new ExplicitCallEffect{*$2, $4};
-}
-
-;
-
-
-effect_list
-
-: /* empty */
-{
- $$ = new std::deque<Effect *>();
-}
-
-| effect semicolons effect_list
-{
- // because of grammar problems, doing this right generates reduce/reduce conflicts
- $$ = $3;
- $$->push_front($1);
-}
-
-;
-
-
-%%
-// Nothing to see here, move along