| @@ -109,7 +109,7 @@ typedef lol::EasyMeshParser::token_type token_type; | |||||
| (aq|addquad) { return token::T_QUAD; } | (aq|addquad) { return token::T_QUAD; } | ||||
| (acg|addcog) { return token::T_COG; } | (acg|addcog) { return token::T_COG; } | ||||
| %{ /* ======= BASE DATA TYPES ========================================= */ %} | |||||
| %{ /* ======= BASE COLOR TYPES ========================================= */ %} | |||||
| %{ /* COLOR */ %} | %{ /* COLOR */ %} | ||||
| #[0-9a-fA-F]{3} { | #[0-9a-fA-F]{3} { | ||||
| uint32_t tmp = std::strtol(yytext + 1, nullptr, 16); | uint32_t tmp = std::strtol(yytext + 1, nullptr, 16); | ||||
| @@ -0,0 +1,164 @@ | |||||
| /* A Bison parser, made by GNU Bison 2.4.2. */ | |||||
| /* Locations for Bison parsers in C++ | |||||
| Copyright (C) 2002-2007, 2009-2010 Free Software Foundation, Inc. | |||||
| 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/>. */ | |||||
| /* As a special exception, you may create a larger work that contains | |||||
| part or all of the Bison parser skeleton and distribute that work | |||||
| under terms of your choice, so long as that work isn't itself a | |||||
| parser generator using the skeleton or a modified version thereof | |||||
| as a parser skeleton. Alternatively, if you modify or redistribute | |||||
| the parser skeleton itself, you may (at your option) remove this | |||||
| special exception, which will cause the skeleton and the resulting | |||||
| Bison output files to be licensed under the GNU General Public | |||||
| License without this special exception. | |||||
| This special exception was added by the Free Software Foundation in | |||||
| version 2.2 of Bison. */ | |||||
| /** | |||||
| ** \file location.hh | |||||
| ** Define the lol::location class. | |||||
| */ | |||||
| #ifndef BISON_LOCATION_HH | |||||
| # define BISON_LOCATION_HH | |||||
| # include <iostream> | |||||
| # include <string> | |||||
| # include "position.hh" | |||||
| namespace lol { | |||||
| /* Line 162 of location.cc */ | |||||
| #line 50 "generated/location.hh" | |||||
| /// Abstract a location. | |||||
| class location | |||||
| { | |||||
| public: | |||||
| /// Construct a location. | |||||
| location () | |||||
| : begin (), end () | |||||
| { | |||||
| } | |||||
| /// Initialization. | |||||
| inline void initialize (std::string* fn) | |||||
| { | |||||
| begin.initialize (fn); | |||||
| end = begin; | |||||
| } | |||||
| /** \name Line and Column related manipulators | |||||
| ** \{ */ | |||||
| public: | |||||
| /// Reset initial location to final location. | |||||
| inline void step () | |||||
| { | |||||
| begin = end; | |||||
| } | |||||
| /// Extend the current location to the COUNT next columns. | |||||
| inline void columns (unsigned int count = 1) | |||||
| { | |||||
| end += count; | |||||
| } | |||||
| /// Extend the current location to the COUNT next lines. | |||||
| inline void lines (unsigned int count = 1) | |||||
| { | |||||
| end.lines (count); | |||||
| } | |||||
| /** \} */ | |||||
| public: | |||||
| /// Beginning of the located region. | |||||
| position begin; | |||||
| /// End of the located region. | |||||
| position end; | |||||
| }; | |||||
| /// Join two location objects to create a location. | |||||
| inline const location operator+ (const location& begin, const location& end) | |||||
| { | |||||
| location res = begin; | |||||
| res.end = end.end; | |||||
| return res; | |||||
| } | |||||
| /// Add two location objects. | |||||
| inline const location operator+ (const location& begin, unsigned int width) | |||||
| { | |||||
| location res = begin; | |||||
| res.columns (width); | |||||
| return res; | |||||
| } | |||||
| /// Add and assign a location. | |||||
| inline location& operator+= (location& res, unsigned int width) | |||||
| { | |||||
| res.columns (width); | |||||
| return res; | |||||
| } | |||||
| /// Compare two location objects. | |||||
| inline bool | |||||
| operator== (const location& loc1, const location& loc2) | |||||
| { | |||||
| return loc1.begin == loc2.begin && loc1.end == loc2.end; | |||||
| } | |||||
| /// Compare two location objects. | |||||
| inline bool | |||||
| operator!= (const location& loc1, const location& loc2) | |||||
| { | |||||
| return !(loc1 == loc2); | |||||
| } | |||||
| /** \brief Intercept output stream redirection. | |||||
| ** \param ostr the destination output stream | |||||
| ** \param loc a reference to the location to redirect | |||||
| ** | |||||
| ** Avoid duplicate information. | |||||
| */ | |||||
| inline std::ostream& operator<< (std::ostream& ostr, const location& loc) | |||||
| { | |||||
| position last = loc.end - 1; | |||||
| ostr << loc.begin; | |||||
| if (last.filename | |||||
| && (!loc.begin.filename | |||||
| || *loc.begin.filename != *last.filename)) | |||||
| ostr << '-' << last; | |||||
| else if (loc.begin.line != last.line) | |||||
| ostr << '-' << last.line << '.' << last.column; | |||||
| else if (loc.begin.column != last.column) | |||||
| ostr << '-' << last.column; | |||||
| return ostr; | |||||
| } | |||||
| } // lol | |||||
| /* Line 271 of location.cc */ | |||||
| #line 163 "generated/location.hh" | |||||
| #endif // not BISON_LOCATION_HH | |||||
| @@ -0,0 +1,161 @@ | |||||
| /* A Bison parser, made by GNU Bison 2.4.2. */ | |||||
| /* Positions for Bison parsers in C++ | |||||
| Copyright (C) 2002-2007, 2009-2010 Free Software Foundation, Inc. | |||||
| 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/>. */ | |||||
| /* As a special exception, you may create a larger work that contains | |||||
| part or all of the Bison parser skeleton and distribute that work | |||||
| under terms of your choice, so long as that work isn't itself a | |||||
| parser generator using the skeleton or a modified version thereof | |||||
| as a parser skeleton. Alternatively, if you modify or redistribute | |||||
| the parser skeleton itself, you may (at your option) remove this | |||||
| special exception, which will cause the skeleton and the resulting | |||||
| Bison output files to be licensed under the GNU General Public | |||||
| License without this special exception. | |||||
| This special exception was added by the Free Software Foundation in | |||||
| version 2.2 of Bison. */ | |||||
| /** | |||||
| ** \file position.hh | |||||
| ** Define the lol::position class. | |||||
| */ | |||||
| #ifndef BISON_POSITION_HH | |||||
| # define BISON_POSITION_HH | |||||
| # include <iostream> | |||||
| # include <string> | |||||
| # include <algorithm> | |||||
| namespace lol { | |||||
| /* Line 37 of location.cc */ | |||||
| #line 50 "generated/position.hh" | |||||
| /// Abstract a position. | |||||
| class position | |||||
| { | |||||
| public: | |||||
| /// Construct a position. | |||||
| position () | |||||
| : filename (0), line (1), column (1) | |||||
| { | |||||
| } | |||||
| /// Initialization. | |||||
| inline void initialize (std::string* fn) | |||||
| { | |||||
| filename = fn; | |||||
| line = 1; | |||||
| column = 1; | |||||
| } | |||||
| /** \name Line and Column related manipulators | |||||
| ** \{ */ | |||||
| public: | |||||
| /// (line related) Advance to the COUNT next lines. | |||||
| inline void lines (int count = 1) | |||||
| { | |||||
| column = 1; | |||||
| line += count; | |||||
| } | |||||
| /// (column related) Advance to the COUNT next columns. | |||||
| inline void columns (int count = 1) | |||||
| { | |||||
| column = std::max (1u, column + count); | |||||
| } | |||||
| /** \} */ | |||||
| public: | |||||
| /// File name to which this position refers. | |||||
| std::string* filename; | |||||
| /// Current line number. | |||||
| unsigned int line; | |||||
| /// Current column number. | |||||
| unsigned int column; | |||||
| }; | |||||
| /// Add and assign a position. | |||||
| inline const position& | |||||
| operator+= (position& res, const int width) | |||||
| { | |||||
| res.columns (width); | |||||
| return res; | |||||
| } | |||||
| /// Add two position objects. | |||||
| inline const position | |||||
| operator+ (const position& begin, const int width) | |||||
| { | |||||
| position res = begin; | |||||
| return res += width; | |||||
| } | |||||
| /// Add and assign a position. | |||||
| inline const position& | |||||
| operator-= (position& res, const int width) | |||||
| { | |||||
| return res += -width; | |||||
| } | |||||
| /// Add two position objects. | |||||
| inline const position | |||||
| operator- (const position& begin, const int width) | |||||
| { | |||||
| return begin + -width; | |||||
| } | |||||
| /// Compare two position objects. | |||||
| inline bool | |||||
| operator== (const position& pos1, const position& pos2) | |||||
| { | |||||
| return (pos1.line == pos2.line | |||||
| && pos1.column == pos2.column | |||||
| && (pos1.filename == pos2.filename | |||||
| || (pos1.filename && pos2.filename | |||||
| && *pos1.filename == *pos2.filename))); | |||||
| } | |||||
| /// Compare two position objects. | |||||
| inline bool | |||||
| operator!= (const position& pos1, const position& pos2) | |||||
| { | |||||
| return !(pos1 == pos2); | |||||
| } | |||||
| /** \brief Intercept output stream redirection. | |||||
| ** \param ostr the destination output stream | |||||
| ** \param pos a reference to the position to redirect | |||||
| */ | |||||
| inline std::ostream& | |||||
| operator<< (std::ostream& ostr, const position& pos) | |||||
| { | |||||
| if (pos.filename) | |||||
| ostr << *pos.filename << ':'; | |||||
| return ostr << pos.line << '.' << pos.column; | |||||
| } | |||||
| } // lol | |||||
| /* Line 144 of location.cc */ | |||||
| #line 161 "generated/position.hh" | |||||
| #endif // not BISON_POSITION_HH | |||||
| @@ -0,0 +1,330 @@ | |||||
| /* A Bison parser, made by GNU Bison 2.4.2. */ | |||||
| /* Skeleton interface for Bison LALR(1) parsers in C++ | |||||
| Copyright (C) 2002-2010 Free Software Foundation, Inc. | |||||
| 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/>. */ | |||||
| /* As a special exception, you may create a larger work that contains | |||||
| part or all of the Bison parser skeleton and distribute that work | |||||
| under terms of your choice, so long as that work isn't itself a | |||||
| parser generator using the skeleton or a modified version thereof | |||||
| as a parser skeleton. Alternatively, if you modify or redistribute | |||||
| the parser skeleton itself, you may (at your option) remove this | |||||
| special exception, which will cause the skeleton and the resulting | |||||
| Bison output files to be licensed under the GNU General Public | |||||
| License without this special exception. | |||||
| This special exception was added by the Free Software Foundation in | |||||
| version 2.2 of Bison. */ | |||||
| /* C++ LALR(1) parser skeleton written by Akim Demaille. */ | |||||
| #ifndef PARSER_HEADER_H | |||||
| # define PARSER_HEADER_H | |||||
| #include <string> | |||||
| #include <iostream> | |||||
| #include "stack.hh" | |||||
| namespace lol { | |||||
| /* Line 34 of lalr1.cc */ | |||||
| #line 49 "generated/scenesetup-parser.h" | |||||
| class position; | |||||
| class location; | |||||
| } // lol | |||||
| /* Line 34 of lalr1.cc */ | |||||
| #line 56 "generated/scenesetup-parser.h" | |||||
| #include "location.hh" | |||||
| /* Enabling traces. */ | |||||
| #ifndef YYDEBUG | |||||
| # define YYDEBUG 1 | |||||
| #endif | |||||
| /* Enabling verbose error messages. */ | |||||
| #ifdef YYERROR_VERBOSE | |||||
| # undef YYERROR_VERBOSE | |||||
| # define YYERROR_VERBOSE 1 | |||||
| #else | |||||
| # define YYERROR_VERBOSE 1 | |||||
| #endif | |||||
| /* Enabling the token table. */ | |||||
| #ifndef YYTOKEN_TABLE | |||||
| # define YYTOKEN_TABLE 0 | |||||
| #endif | |||||
| /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. | |||||
| If N is 0, then set CURRENT to the empty location which ends | |||||
| the previous symbol: RHS[0] (always defined). */ | |||||
| #ifndef YYLLOC_DEFAULT | |||||
| # define YYLLOC_DEFAULT(Current, Rhs, N) \ | |||||
| do { \ | |||||
| if (N) \ | |||||
| { \ | |||||
| (Current).begin = (Rhs)[1].begin; \ | |||||
| (Current).end = (Rhs)[N].end; \ | |||||
| } \ | |||||
| else \ | |||||
| { \ | |||||
| (Current).begin = (Current).end = (Rhs)[0].end; \ | |||||
| } \ | |||||
| } while (false) | |||||
| #endif | |||||
| namespace lol { | |||||
| /* Line 34 of lalr1.cc */ | |||||
| #line 101 "generated/scenesetup-parser.h" | |||||
| /// A Bison parser. | |||||
| class SceneSetupParser | |||||
| { | |||||
| public: | |||||
| /// Symbol semantic values. | |||||
| #ifndef YYSTYPE | |||||
| union semantic_type | |||||
| { | |||||
| /* Line 34 of lalr1.cc */ | |||||
| #line 33 "scenesetup-parser.y" | |||||
| float fval; | |||||
| int ival; | |||||
| bool bval; | |||||
| float vval[4]; | |||||
| int ivval[4]; | |||||
| char* sval; | |||||
| char* svval; | |||||
| /* Can't use uin32_t here for some reason */ | |||||
| unsigned u32val; | |||||
| /* Line 34 of lalr1.cc */ | |||||
| #line 128 "generated/scenesetup-parser.h" | |||||
| }; | |||||
| #else | |||||
| typedef YYSTYPE semantic_type; | |||||
| #endif | |||||
| /// Symbol locations. | |||||
| typedef location location_type; | |||||
| /// Tokens. | |||||
| struct token | |||||
| { | |||||
| /* Tokens. */ | |||||
| enum yytokentype { | |||||
| T_END = 0, | |||||
| T_COLOR = 258, | |||||
| T_ADDLIGHT = 259, | |||||
| T_OBJPOSITION = 260, | |||||
| T_OBJLOOKAT = 261, | |||||
| T_OBJCOLOR = 262, | |||||
| T_CUSTOMCMD = 263, | |||||
| T_ERROR = 264, | |||||
| F_NUMBER = 265, | |||||
| I_NUMBER = 266, | |||||
| STRING = 267, | |||||
| STRING_VAR = 268, | |||||
| BOOLEAN = 269, | |||||
| COLOR = 270 | |||||
| }; | |||||
| }; | |||||
| /// Token type. | |||||
| typedef token::yytokentype token_type; | |||||
| /// Build a parser object. | |||||
| SceneSetupParser (class SceneSetupCompiler& uc_yyarg); | |||||
| virtual ~SceneSetupParser (); | |||||
| /// Parse. | |||||
| /// \returns 0 iff parsing succeeded. | |||||
| virtual int parse (); | |||||
| #if YYDEBUG | |||||
| /// The current debugging stream. | |||||
| std::ostream& debug_stream () const; | |||||
| /// Set the current debugging stream. | |||||
| void set_debug_stream (std::ostream &); | |||||
| /// Type for debugging levels. | |||||
| typedef int debug_level_type; | |||||
| /// The current debugging level. | |||||
| debug_level_type debug_level () const; | |||||
| /// Set the current debugging level. | |||||
| void set_debug_level (debug_level_type l); | |||||
| #endif | |||||
| private: | |||||
| /// Report a syntax error. | |||||
| /// \param loc where the syntax error is found. | |||||
| /// \param msg a description of the syntax error. | |||||
| virtual void error (const location_type& loc, const std::string& msg); | |||||
| /// Generate an error message. | |||||
| /// \param state the state where the error occurred. | |||||
| /// \param tok the lookahead token. | |||||
| virtual std::string yysyntax_error_ (int yystate, int tok); | |||||
| #if YYDEBUG | |||||
| /// \brief Report a symbol value on the debug stream. | |||||
| /// \param yytype The token type. | |||||
| /// \param yyvaluep Its semantic value. | |||||
| /// \param yylocationp Its location. | |||||
| virtual void yy_symbol_value_print_ (int yytype, | |||||
| const semantic_type* yyvaluep, | |||||
| const location_type* yylocationp); | |||||
| /// \brief Report a symbol on the debug stream. | |||||
| /// \param yytype The token type. | |||||
| /// \param yyvaluep Its semantic value. | |||||
| /// \param yylocationp Its location. | |||||
| virtual void yy_symbol_print_ (int yytype, | |||||
| const semantic_type* yyvaluep, | |||||
| const location_type* yylocationp); | |||||
| #endif | |||||
| /// State numbers. | |||||
| typedef int state_type; | |||||
| /// State stack type. | |||||
| typedef stack<state_type> state_stack_type; | |||||
| /// Semantic value stack type. | |||||
| typedef stack<semantic_type> semantic_stack_type; | |||||
| /// location stack type. | |||||
| typedef stack<location_type> location_stack_type; | |||||
| /// The state stack. | |||||
| state_stack_type yystate_stack_; | |||||
| /// The semantic value stack. | |||||
| semantic_stack_type yysemantic_stack_; | |||||
| /// The location stack. | |||||
| location_stack_type yylocation_stack_; | |||||
| /// Internal symbol numbers. | |||||
| typedef unsigned char token_number_type; | |||||
| /* Tables. */ | |||||
| /// For a state, the index in \a yytable_ of its portion. | |||||
| static const signed char yypact_[]; | |||||
| static const signed char yypact_ninf_; | |||||
| /// For a state, default rule to reduce. | |||||
| /// Unless\a yytable_ specifies something else to do. | |||||
| /// Zero means the default is an error. | |||||
| static const unsigned char yydefact_[]; | |||||
| static const signed char yypgoto_[]; | |||||
| static const signed char yydefgoto_[]; | |||||
| /// What to do in a state. | |||||
| /// \a yytable_[yypact_[s]]: what to do in state \a s. | |||||
| /// - if positive, shift that token. | |||||
| /// - if negative, reduce the rule which number is the opposite. | |||||
| /// - if zero, do what YYDEFACT says. | |||||
| static const unsigned char yytable_[]; | |||||
| static const signed char yytable_ninf_; | |||||
| static const unsigned char yycheck_[]; | |||||
| /// For a state, its accessing symbol. | |||||
| static const unsigned char yystos_[]; | |||||
| /// For a rule, its LHS. | |||||
| static const unsigned char yyr1_[]; | |||||
| /// For a rule, its RHS length. | |||||
| static const unsigned char yyr2_[]; | |||||
| #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE | |||||
| /// For a symbol, its name in clear. | |||||
| static const char* const yytname_[]; | |||||
| #endif | |||||
| #if YYERROR_VERBOSE | |||||
| /// Convert the symbol name \a n to a form suitable for a diagnostic. | |||||
| virtual std::string yytnamerr_ (const char *n); | |||||
| #endif | |||||
| #if YYDEBUG | |||||
| /// A type to store symbol numbers and -1. | |||||
| typedef signed char rhs_number_type; | |||||
| /// A `-1'-separated list of the rules' RHS. | |||||
| static const rhs_number_type yyrhs_[]; | |||||
| /// For each rule, the index of the first RHS symbol in \a yyrhs_. | |||||
| static const unsigned char yyprhs_[]; | |||||
| /// For each rule, its source line number. | |||||
| static const unsigned char yyrline_[]; | |||||
| /// For each scanner token number, its symbol number. | |||||
| static const unsigned short int yytoken_number_[]; | |||||
| /// Report on the debug stream that the rule \a r is going to be reduced. | |||||
| virtual void yy_reduce_print_ (int r); | |||||
| /// Print the state stack on the debug stream. | |||||
| virtual void yystack_print_ (); | |||||
| /* Debugging. */ | |||||
| int yydebug_; | |||||
| std::ostream* yycdebug_; | |||||
| #endif | |||||
| /// Convert a scanner token number \a t to a symbol number. | |||||
| token_number_type yytranslate_ (int t); | |||||
| /// \brief Reclaim the memory associated to a symbol. | |||||
| /// \param yymsg Why this token is reclaimed. | |||||
| /// \param yytype The symbol type. | |||||
| /// \param yyvaluep Its semantic value. | |||||
| /// \param yylocationp Its location. | |||||
| inline void yydestruct_ (const char* yymsg, | |||||
| int yytype, | |||||
| semantic_type* yyvaluep, | |||||
| location_type* yylocationp); | |||||
| /// Pop \a n symbols the three stacks. | |||||
| inline void yypop_ (unsigned int n = 1); | |||||
| /* Constants. */ | |||||
| static const int yyeof_; | |||||
| /* LAST_ -- Last index in TABLE_. */ | |||||
| static const int yylast_; | |||||
| static const int yynnts_; | |||||
| static const int yyempty_; | |||||
| static const int yyfinal_; | |||||
| static const int yyterror_; | |||||
| static const int yyerrcode_; | |||||
| static const int yyntokens_; | |||||
| static const unsigned int yyuser_token_number_max_; | |||||
| static const token_number_type yyundef_token_; | |||||
| /* User arguments. */ | |||||
| class SceneSetupCompiler& uc; | |||||
| }; | |||||
| } // lol | |||||
| /* Line 34 of lalr1.cc */ | |||||
| #line 327 "generated/scenesetup-parser.h" | |||||
| #endif /* ! defined PARSER_HEADER_H */ | |||||
| @@ -0,0 +1,700 @@ | |||||
| Nonterminals useless in grammar | |||||
| iv3 | |||||
| bv | |||||
| Terminals unused in grammar | |||||
| T_COLOR | |||||
| T_ERROR | |||||
| BOOLEAN | |||||
| Rules useless in grammar | |||||
| 32 iv3: '(' iv ')' | |||||
| 33 | '(' iv iv iv ')' | |||||
| 34 bv: BOOLEAN | |||||
| 35 | I_NUMBER | |||||
| 36 | F_NUMBER | |||||
| Rules useless in parser due to conflicts | |||||
| 21 iv: I_NUMBER | |||||
| 22 | '-' iv | |||||
| 23 | F_NUMBER | |||||
| 24 | '-' fv | |||||
| State 9 conflicts: 5 shift/reduce | |||||
| State 30 conflicts: 10 reduce/reduce | |||||
| State 31 conflicts: 10 reduce/reduce | |||||
| State 39 conflicts: 10 reduce/reduce | |||||
| State 40 conflicts: 10 reduce/reduce | |||||
| Grammar | |||||
| 0 $accept: sstp_description T_END | |||||
| 1 sstp_description: sstp_expression_list T_END | |||||
| 2 sstp_expression_list: sstp_expression | |||||
| 3 | sstp_expression sstp_expression_list | |||||
| 4 sstp_expression: sstp_command_list | |||||
| 5 sstp_command_list: sstp_command | |||||
| 6 | sstp_command_list sstp_command | |||||
| 7 sstp_command: light_command | |||||
| 8 | setup_command | |||||
| 9 | custom_command | |||||
| 10 light_command: T_ADDLIGHT | |||||
| 11 | T_ADDLIGHT fv | |||||
| 12 setup_command: T_OBJPOSITION v3 | |||||
| 13 | T_OBJLOOKAT v3 | |||||
| 14 | T_OBJCOLOR v4 | |||||
| 15 | T_OBJCOLOR COLOR | |||||
| 16 custom_command: T_CUSTOMCMD svv sv | |||||
| 17 fv: F_NUMBER | |||||
| 18 | '-' fv | |||||
| 19 | I_NUMBER | |||||
| 20 | '-' iv | |||||
| 21 iv: I_NUMBER | |||||
| 22 | '-' iv | |||||
| 23 | F_NUMBER | |||||
| 24 | '-' fv | |||||
| 25 v3: '(' fv ')' | |||||
| 26 | '(' fv fv fv ')' | |||||
| 27 v4: '(' fv ')' | |||||
| 28 | '(' fv fv fv fv ')' | |||||
| 29 svv: STRING_VAR | |||||
| 30 sv: STRING | |||||
| 31 | STRING sv | |||||
| Terminals, with rules where they appear | |||||
| T_END (0) 0 1 | |||||
| '(' (40) 25 26 27 28 | |||||
| ')' (41) 25 26 27 28 | |||||
| '-' (45) 18 20 22 24 | |||||
| error (256) | |||||
| T_COLOR (258) | |||||
| T_ADDLIGHT (259) 10 11 | |||||
| T_OBJPOSITION (260) 12 | |||||
| T_OBJLOOKAT (261) 13 | |||||
| T_OBJCOLOR (262) 14 15 | |||||
| T_CUSTOMCMD (263) 16 | |||||
| T_ERROR (264) | |||||
| F_NUMBER (265) 17 23 | |||||
| I_NUMBER (266) 19 21 | |||||
| STRING (267) 30 31 | |||||
| STRING_VAR (268) 29 | |||||
| BOOLEAN (269) | |||||
| COLOR (270) 15 | |||||
| Nonterminals, with rules where they appear | |||||
| $accept (19) | |||||
| on left: 0 | |||||
| sstp_description (20) | |||||
| on left: 1, on right: 0 | |||||
| sstp_expression_list (21) | |||||
| on left: 2 3, on right: 1 3 | |||||
| sstp_expression (22) | |||||
| on left: 4, on right: 2 3 | |||||
| sstp_command_list (23) | |||||
| on left: 5 6, on right: 4 6 | |||||
| sstp_command (24) | |||||
| on left: 7 8 9, on right: 5 6 | |||||
| light_command (25) | |||||
| on left: 10 11, on right: 7 | |||||
| setup_command (26) | |||||
| on left: 12 13 14 15, on right: 8 | |||||
| custom_command (27) | |||||
| on left: 16, on right: 9 | |||||
| fv (28) | |||||
| on left: 17 18 19 20, on right: 11 18 24 25 26 27 28 | |||||
| iv (29) | |||||
| on left: 21 22 23 24, on right: 20 22 | |||||
| v3 (30) | |||||
| on left: 25 26, on right: 12 13 | |||||
| v4 (31) | |||||
| on left: 27 28, on right: 14 | |||||
| svv (32) | |||||
| on left: 29, on right: 16 | |||||
| sv (33) | |||||
| on left: 30 31, on right: 16 31 | |||||
| state 0 | |||||
| 0 $accept: . sstp_description T_END | |||||
| T_ADDLIGHT shift, and go to state 1 | |||||
| T_OBJPOSITION shift, and go to state 2 | |||||
| T_OBJLOOKAT shift, and go to state 3 | |||||
| T_OBJCOLOR shift, and go to state 4 | |||||
| T_CUSTOMCMD shift, and go to state 5 | |||||
| sstp_description go to state 6 | |||||
| sstp_expression_list go to state 7 | |||||
| sstp_expression go to state 8 | |||||
| sstp_command_list go to state 9 | |||||
| sstp_command go to state 10 | |||||
| light_command go to state 11 | |||||
| setup_command go to state 12 | |||||
| custom_command go to state 13 | |||||
| state 1 | |||||
| 10 light_command: T_ADDLIGHT . | |||||
| 11 | T_ADDLIGHT . fv | |||||
| F_NUMBER shift, and go to state 14 | |||||
| I_NUMBER shift, and go to state 15 | |||||
| '-' shift, and go to state 16 | |||||
| $default reduce using rule 10 (light_command) | |||||
| fv go to state 17 | |||||
| state 2 | |||||
| 12 setup_command: T_OBJPOSITION . v3 | |||||
| '(' shift, and go to state 18 | |||||
| v3 go to state 19 | |||||
| state 3 | |||||
| 13 setup_command: T_OBJLOOKAT . v3 | |||||
| '(' shift, and go to state 18 | |||||
| v3 go to state 20 | |||||
| state 4 | |||||
| 14 setup_command: T_OBJCOLOR . v4 | |||||
| 15 | T_OBJCOLOR . COLOR | |||||
| COLOR shift, and go to state 21 | |||||
| '(' shift, and go to state 22 | |||||
| v4 go to state 23 | |||||
| state 5 | |||||
| 16 custom_command: T_CUSTOMCMD . svv sv | |||||
| STRING_VAR shift, and go to state 24 | |||||
| svv go to state 25 | |||||
| state 6 | |||||
| 0 $accept: sstp_description . T_END | |||||
| T_END shift, and go to state 26 | |||||
| state 7 | |||||
| 1 sstp_description: sstp_expression_list . T_END | |||||
| T_END shift, and go to state 27 | |||||
| state 8 | |||||
| 2 sstp_expression_list: sstp_expression . | |||||
| 3 | sstp_expression . sstp_expression_list | |||||
| T_ADDLIGHT shift, and go to state 1 | |||||
| T_OBJPOSITION shift, and go to state 2 | |||||
| T_OBJLOOKAT shift, and go to state 3 | |||||
| T_OBJCOLOR shift, and go to state 4 | |||||
| T_CUSTOMCMD shift, and go to state 5 | |||||
| $default reduce using rule 2 (sstp_expression_list) | |||||
| sstp_expression_list go to state 28 | |||||
| sstp_expression go to state 8 | |||||
| sstp_command_list go to state 9 | |||||
| sstp_command go to state 10 | |||||
| light_command go to state 11 | |||||
| setup_command go to state 12 | |||||
| custom_command go to state 13 | |||||
| state 9 | |||||
| 4 sstp_expression: sstp_command_list . | |||||
| 6 sstp_command_list: sstp_command_list . sstp_command | |||||
| T_ADDLIGHT shift, and go to state 1 | |||||
| T_OBJPOSITION shift, and go to state 2 | |||||
| T_OBJLOOKAT shift, and go to state 3 | |||||
| T_OBJCOLOR shift, and go to state 4 | |||||
| T_CUSTOMCMD shift, and go to state 5 | |||||
| T_ADDLIGHT [reduce using rule 4 (sstp_expression)] | |||||
| T_OBJPOSITION [reduce using rule 4 (sstp_expression)] | |||||
| T_OBJLOOKAT [reduce using rule 4 (sstp_expression)] | |||||
| T_OBJCOLOR [reduce using rule 4 (sstp_expression)] | |||||
| T_CUSTOMCMD [reduce using rule 4 (sstp_expression)] | |||||
| $default reduce using rule 4 (sstp_expression) | |||||
| sstp_command go to state 29 | |||||
| light_command go to state 11 | |||||
| setup_command go to state 12 | |||||
| custom_command go to state 13 | |||||
| state 10 | |||||
| 5 sstp_command_list: sstp_command . | |||||
| $default reduce using rule 5 (sstp_command_list) | |||||
| state 11 | |||||
| 7 sstp_command: light_command . | |||||
| $default reduce using rule 7 (sstp_command) | |||||
| state 12 | |||||
| 8 sstp_command: setup_command . | |||||
| $default reduce using rule 8 (sstp_command) | |||||
| state 13 | |||||
| 9 sstp_command: custom_command . | |||||
| $default reduce using rule 9 (sstp_command) | |||||
| state 14 | |||||
| 17 fv: F_NUMBER . | |||||
| $default reduce using rule 17 (fv) | |||||
| state 15 | |||||
| 19 fv: I_NUMBER . | |||||
| $default reduce using rule 19 (fv) | |||||
| state 16 | |||||
| 18 fv: '-' . fv | |||||
| 20 | '-' . iv | |||||
| F_NUMBER shift, and go to state 30 | |||||
| I_NUMBER shift, and go to state 31 | |||||
| '-' shift, and go to state 32 | |||||
| fv go to state 33 | |||||
| iv go to state 34 | |||||
| state 17 | |||||
| 11 light_command: T_ADDLIGHT fv . | |||||
| $default reduce using rule 11 (light_command) | |||||
| state 18 | |||||
| 25 v3: '(' . fv ')' | |||||
| 26 | '(' . fv fv fv ')' | |||||
| F_NUMBER shift, and go to state 14 | |||||
| I_NUMBER shift, and go to state 15 | |||||
| '-' shift, and go to state 16 | |||||
| fv go to state 35 | |||||
| state 19 | |||||
| 12 setup_command: T_OBJPOSITION v3 . | |||||
| $default reduce using rule 12 (setup_command) | |||||
| state 20 | |||||
| 13 setup_command: T_OBJLOOKAT v3 . | |||||
| $default reduce using rule 13 (setup_command) | |||||
| state 21 | |||||
| 15 setup_command: T_OBJCOLOR COLOR . | |||||
| $default reduce using rule 15 (setup_command) | |||||
| state 22 | |||||
| 27 v4: '(' . fv ')' | |||||
| 28 | '(' . fv fv fv fv ')' | |||||
| F_NUMBER shift, and go to state 14 | |||||
| I_NUMBER shift, and go to state 15 | |||||
| '-' shift, and go to state 16 | |||||
| fv go to state 36 | |||||
| state 23 | |||||
| 14 setup_command: T_OBJCOLOR v4 . | |||||
| $default reduce using rule 14 (setup_command) | |||||
| state 24 | |||||
| 29 svv: STRING_VAR . | |||||
| $default reduce using rule 29 (svv) | |||||
| state 25 | |||||
| 16 custom_command: T_CUSTOMCMD svv . sv | |||||
| STRING shift, and go to state 37 | |||||
| sv go to state 38 | |||||
| state 26 | |||||
| 0 $accept: sstp_description T_END . | |||||
| $default accept | |||||
| state 27 | |||||
| 1 sstp_description: sstp_expression_list T_END . | |||||
| $default reduce using rule 1 (sstp_description) | |||||
| state 28 | |||||
| 3 sstp_expression_list: sstp_expression sstp_expression_list . | |||||
| $default reduce using rule 3 (sstp_expression_list) | |||||
| state 29 | |||||
| 6 sstp_command_list: sstp_command_list sstp_command . | |||||
| $default reduce using rule 6 (sstp_command_list) | |||||
| state 30 | |||||
| 17 fv: F_NUMBER . | |||||
| 23 iv: F_NUMBER . | |||||
| T_END reduce using rule 17 (fv) | |||||
| T_END [reduce using rule 23 (iv)] | |||||
| T_ADDLIGHT reduce using rule 17 (fv) | |||||
| T_ADDLIGHT [reduce using rule 23 (iv)] | |||||
| T_OBJPOSITION reduce using rule 17 (fv) | |||||
| T_OBJPOSITION [reduce using rule 23 (iv)] | |||||
| T_OBJLOOKAT reduce using rule 17 (fv) | |||||
| T_OBJLOOKAT [reduce using rule 23 (iv)] | |||||
| T_OBJCOLOR reduce using rule 17 (fv) | |||||
| T_OBJCOLOR [reduce using rule 23 (iv)] | |||||
| T_CUSTOMCMD reduce using rule 17 (fv) | |||||
| T_CUSTOMCMD [reduce using rule 23 (iv)] | |||||
| F_NUMBER reduce using rule 17 (fv) | |||||
| F_NUMBER [reduce using rule 23 (iv)] | |||||
| I_NUMBER reduce using rule 17 (fv) | |||||
| I_NUMBER [reduce using rule 23 (iv)] | |||||
| '-' reduce using rule 17 (fv) | |||||
| '-' [reduce using rule 23 (iv)] | |||||
| ')' reduce using rule 17 (fv) | |||||
| ')' [reduce using rule 23 (iv)] | |||||
| $default reduce using rule 17 (fv) | |||||
| state 31 | |||||
| 19 fv: I_NUMBER . | |||||
| 21 iv: I_NUMBER . | |||||
| T_END reduce using rule 19 (fv) | |||||
| T_END [reduce using rule 21 (iv)] | |||||
| T_ADDLIGHT reduce using rule 19 (fv) | |||||
| T_ADDLIGHT [reduce using rule 21 (iv)] | |||||
| T_OBJPOSITION reduce using rule 19 (fv) | |||||
| T_OBJPOSITION [reduce using rule 21 (iv)] | |||||
| T_OBJLOOKAT reduce using rule 19 (fv) | |||||
| T_OBJLOOKAT [reduce using rule 21 (iv)] | |||||
| T_OBJCOLOR reduce using rule 19 (fv) | |||||
| T_OBJCOLOR [reduce using rule 21 (iv)] | |||||
| T_CUSTOMCMD reduce using rule 19 (fv) | |||||
| T_CUSTOMCMD [reduce using rule 21 (iv)] | |||||
| F_NUMBER reduce using rule 19 (fv) | |||||
| F_NUMBER [reduce using rule 21 (iv)] | |||||
| I_NUMBER reduce using rule 19 (fv) | |||||
| I_NUMBER [reduce using rule 21 (iv)] | |||||
| '-' reduce using rule 19 (fv) | |||||
| '-' [reduce using rule 21 (iv)] | |||||
| ')' reduce using rule 19 (fv) | |||||
| ')' [reduce using rule 21 (iv)] | |||||
| $default reduce using rule 19 (fv) | |||||
| state 32 | |||||
| 18 fv: '-' . fv | |||||
| 20 | '-' . iv | |||||
| 22 iv: '-' . iv | |||||
| 24 | '-' . fv | |||||
| F_NUMBER shift, and go to state 30 | |||||
| I_NUMBER shift, and go to state 31 | |||||
| '-' shift, and go to state 32 | |||||
| fv go to state 39 | |||||
| iv go to state 40 | |||||
| state 33 | |||||
| 18 fv: '-' fv . | |||||
| $default reduce using rule 18 (fv) | |||||
| state 34 | |||||
| 20 fv: '-' iv . | |||||
| $default reduce using rule 20 (fv) | |||||
| state 35 | |||||
| 25 v3: '(' fv . ')' | |||||
| 26 | '(' fv . fv fv ')' | |||||
| F_NUMBER shift, and go to state 14 | |||||
| I_NUMBER shift, and go to state 15 | |||||
| '-' shift, and go to state 16 | |||||
| ')' shift, and go to state 41 | |||||
| fv go to state 42 | |||||
| state 36 | |||||
| 27 v4: '(' fv . ')' | |||||
| 28 | '(' fv . fv fv fv ')' | |||||
| F_NUMBER shift, and go to state 14 | |||||
| I_NUMBER shift, and go to state 15 | |||||
| '-' shift, and go to state 16 | |||||
| ')' shift, and go to state 43 | |||||
| fv go to state 44 | |||||
| state 37 | |||||
| 30 sv: STRING . | |||||
| 31 | STRING . sv | |||||
| STRING shift, and go to state 37 | |||||
| $default reduce using rule 30 (sv) | |||||
| sv go to state 45 | |||||
| state 38 | |||||
| 16 custom_command: T_CUSTOMCMD svv sv . | |||||
| $default reduce using rule 16 (custom_command) | |||||
| state 39 | |||||
| 18 fv: '-' fv . | |||||
| 24 iv: '-' fv . | |||||
| T_END reduce using rule 18 (fv) | |||||
| T_END [reduce using rule 24 (iv)] | |||||
| T_ADDLIGHT reduce using rule 18 (fv) | |||||
| T_ADDLIGHT [reduce using rule 24 (iv)] | |||||
| T_OBJPOSITION reduce using rule 18 (fv) | |||||
| T_OBJPOSITION [reduce using rule 24 (iv)] | |||||
| T_OBJLOOKAT reduce using rule 18 (fv) | |||||
| T_OBJLOOKAT [reduce using rule 24 (iv)] | |||||
| T_OBJCOLOR reduce using rule 18 (fv) | |||||
| T_OBJCOLOR [reduce using rule 24 (iv)] | |||||
| T_CUSTOMCMD reduce using rule 18 (fv) | |||||
| T_CUSTOMCMD [reduce using rule 24 (iv)] | |||||
| F_NUMBER reduce using rule 18 (fv) | |||||
| F_NUMBER [reduce using rule 24 (iv)] | |||||
| I_NUMBER reduce using rule 18 (fv) | |||||
| I_NUMBER [reduce using rule 24 (iv)] | |||||
| '-' reduce using rule 18 (fv) | |||||
| '-' [reduce using rule 24 (iv)] | |||||
| ')' reduce using rule 18 (fv) | |||||
| ')' [reduce using rule 24 (iv)] | |||||
| $default reduce using rule 18 (fv) | |||||
| state 40 | |||||
| 20 fv: '-' iv . | |||||
| 22 iv: '-' iv . | |||||
| T_END reduce using rule 20 (fv) | |||||
| T_END [reduce using rule 22 (iv)] | |||||
| T_ADDLIGHT reduce using rule 20 (fv) | |||||
| T_ADDLIGHT [reduce using rule 22 (iv)] | |||||
| T_OBJPOSITION reduce using rule 20 (fv) | |||||
| T_OBJPOSITION [reduce using rule 22 (iv)] | |||||
| T_OBJLOOKAT reduce using rule 20 (fv) | |||||
| T_OBJLOOKAT [reduce using rule 22 (iv)] | |||||
| T_OBJCOLOR reduce using rule 20 (fv) | |||||
| T_OBJCOLOR [reduce using rule 22 (iv)] | |||||
| T_CUSTOMCMD reduce using rule 20 (fv) | |||||
| T_CUSTOMCMD [reduce using rule 22 (iv)] | |||||
| F_NUMBER reduce using rule 20 (fv) | |||||
| F_NUMBER [reduce using rule 22 (iv)] | |||||
| I_NUMBER reduce using rule 20 (fv) | |||||
| I_NUMBER [reduce using rule 22 (iv)] | |||||
| '-' reduce using rule 20 (fv) | |||||
| '-' [reduce using rule 22 (iv)] | |||||
| ')' reduce using rule 20 (fv) | |||||
| ')' [reduce using rule 22 (iv)] | |||||
| $default reduce using rule 20 (fv) | |||||
| state 41 | |||||
| 25 v3: '(' fv ')' . | |||||
| $default reduce using rule 25 (v3) | |||||
| state 42 | |||||
| 26 v3: '(' fv fv . fv ')' | |||||
| F_NUMBER shift, and go to state 14 | |||||
| I_NUMBER shift, and go to state 15 | |||||
| '-' shift, and go to state 16 | |||||
| fv go to state 46 | |||||
| state 43 | |||||
| 27 v4: '(' fv ')' . | |||||
| $default reduce using rule 27 (v4) | |||||
| state 44 | |||||
| 28 v4: '(' fv fv . fv fv ')' | |||||
| F_NUMBER shift, and go to state 14 | |||||
| I_NUMBER shift, and go to state 15 | |||||
| '-' shift, and go to state 16 | |||||
| fv go to state 47 | |||||
| state 45 | |||||
| 31 sv: STRING sv . | |||||
| $default reduce using rule 31 (sv) | |||||
| state 46 | |||||
| 26 v3: '(' fv fv fv . ')' | |||||
| ')' shift, and go to state 48 | |||||
| state 47 | |||||
| 28 v4: '(' fv fv fv . fv ')' | |||||
| F_NUMBER shift, and go to state 14 | |||||
| I_NUMBER shift, and go to state 15 | |||||
| '-' shift, and go to state 16 | |||||
| fv go to state 49 | |||||
| state 48 | |||||
| 26 v3: '(' fv fv fv ')' . | |||||
| $default reduce using rule 26 (v3) | |||||
| state 49 | |||||
| 28 v4: '(' fv fv fv fv . ')' | |||||
| ')' shift, and go to state 50 | |||||
| state 50 | |||||
| 28 v4: '(' fv fv fv fv ')' . | |||||
| $default reduce using rule 28 (v4) | |||||
| @@ -0,0 +1,135 @@ | |||||
| /* A Bison parser, made by GNU Bison 2.4.2. */ | |||||
| /* Stack handling for Bison parsers in C++ | |||||
| Copyright (C) 2002-2010 Free Software Foundation, Inc. | |||||
| 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/>. */ | |||||
| /* As a special exception, you may create a larger work that contains | |||||
| part or all of the Bison parser skeleton and distribute that work | |||||
| under terms of your choice, so long as that work isn't itself a | |||||
| parser generator using the skeleton or a modified version thereof | |||||
| as a parser skeleton. Alternatively, if you modify or redistribute | |||||
| the parser skeleton itself, you may (at your option) remove this | |||||
| special exception, which will cause the skeleton and the resulting | |||||
| Bison output files to be licensed under the GNU General Public | |||||
| License without this special exception. | |||||
| This special exception was added by the Free Software Foundation in | |||||
| version 2.2 of Bison. */ | |||||
| #ifndef BISON_STACK_HH | |||||
| # define BISON_STACK_HH | |||||
| #include <deque> | |||||
| namespace lol { | |||||
| /* Line 1066 of lalr1.cc */ | |||||
| #line 43 "generated/stack.hh" | |||||
| template <class T, class S = std::deque<T> > | |||||
| class stack | |||||
| { | |||||
| public: | |||||
| // Hide our reversed order. | |||||
| typedef typename S::reverse_iterator iterator; | |||||
| typedef typename S::const_reverse_iterator const_iterator; | |||||
| stack () : seq_ () | |||||
| { | |||||
| } | |||||
| stack (unsigned int n) : seq_ (n) | |||||
| { | |||||
| } | |||||
| inline | |||||
| T& | |||||
| operator [] (unsigned int i) | |||||
| { | |||||
| return seq_[i]; | |||||
| } | |||||
| inline | |||||
| const T& | |||||
| operator [] (unsigned int i) const | |||||
| { | |||||
| return seq_[i]; | |||||
| } | |||||
| inline | |||||
| void | |||||
| push (const T& t) | |||||
| { | |||||
| seq_.push_front (t); | |||||
| } | |||||
| inline | |||||
| void | |||||
| pop (unsigned int n = 1) | |||||
| { | |||||
| for (; n; --n) | |||||
| seq_.pop_front (); | |||||
| } | |||||
| inline | |||||
| unsigned int | |||||
| height () const | |||||
| { | |||||
| return seq_.size (); | |||||
| } | |||||
| inline const_iterator begin () const { return seq_.rbegin (); } | |||||
| inline const_iterator end () const { return seq_.rend (); } | |||||
| private: | |||||
| S seq_; | |||||
| }; | |||||
| /// Present a slice of the top of a stack. | |||||
| template <class T, class S = stack<T> > | |||||
| class slice | |||||
| { | |||||
| public: | |||||
| slice (const S& stack, | |||||
| unsigned int range) : stack_ (stack), | |||||
| range_ (range) | |||||
| { | |||||
| } | |||||
| inline | |||||
| const T& | |||||
| operator [] (unsigned int i) const | |||||
| { | |||||
| return stack_[range_ - i]; | |||||
| } | |||||
| private: | |||||
| const S& stack_; | |||||
| unsigned int range_; | |||||
| }; | |||||
| } // lol | |||||
| /* Line 1152 of lalr1.cc */ | |||||
| #line 133 "generated/stack.hh" | |||||
| #endif // not BISON_STACK_HH[]dnl | |||||
| @@ -17,6 +17,7 @@ | |||||
| #include <cfloat> /* for FLT_MAX */ | #include <cfloat> /* for FLT_MAX */ | ||||
| #include "core.h" | #include "core.h" | ||||
| #include "scenesetup.h" | |||||
| using namespace std; | using namespace std; | ||||
| using namespace lol; | using namespace lol; | ||||
| @@ -129,9 +130,12 @@ public: | |||||
| { | { | ||||
| if (m_camera) | if (m_camera) | ||||
| g_scene->PopCamera(m_camera); | g_scene->PopCamera(m_camera); | ||||
| for (int i = 0; i < m_lights.Count(); ++i) | |||||
| Ticker::Unref(m_lights[i]); | |||||
| if (m_ssetup) | |||||
| delete(m_ssetup); | |||||
| MessageService::Destroy(); | MessageService::Destroy(); | ||||
| m_ssetup = nullptr; | |||||
| m_camera = nullptr; | |||||
| } | } | ||||
| bool KeyReleased(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsReleased()); } | bool KeyReleased(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsReleased()); } | ||||
| @@ -228,15 +232,11 @@ public: | |||||
| g_scene->PushCamera(m_camera); | g_scene->PushCamera(m_camera); | ||||
| //Lights setup | //Lights setup | ||||
| m_lights << new Light(); | |||||
| m_lights.Last()->SetPosition(vec4(4.f, -1.f, -4.f, 0.f)); | |||||
| m_lights.Last()->SetColor(vec4(.0f, .2f, .5f, 1.f)); | |||||
| Ticker::Ref(m_lights.Last()); | |||||
| m_lights << new Light(); | |||||
| m_lights.Last()->SetPosition(vec4(8.f, 2.f, 6.f, 0.f)); | |||||
| m_lights.Last()->SetColor(vec4(1.f, 1.f, 1.f, 1.f)); | |||||
| Ticker::Ref(m_lights.Last()); | |||||
| m_ssetup = new SceneSetup(); | |||||
| m_ssetup->Compile(" addlight 0.0 position (4 -1 -4) color (.0 .2 .5 1)" | |||||
| " addlight 0.0 position (8 2 6) color #ffff" | |||||
| " custom setmesh \"sc#fff ab 1\""); | |||||
| m_ssetup->Startup(); | |||||
| //stream update | //stream update | ||||
| m_stream_update_time = 2.0f; | m_stream_update_time = 2.0f; | ||||
| @@ -433,14 +433,30 @@ public: | |||||
| int o = 1; | int o = 1; | ||||
| while (o-- > 0) | while (o-- > 0) | ||||
| { | { | ||||
| if (m_mesh_id == m_meshes.Count() - 1) | |||||
| m_mesh_id++; | |||||
| //Create a new mesh | |||||
| EasyMesh* em = new EasyMesh(); | |||||
| if (em->Compile(mesh.C())) | |||||
| m_meshes.Push(em); | |||||
| else | |||||
| delete(em); | |||||
| SceneSetup* new_ssetup = new SceneSetup(); | |||||
| if (new_ssetup->Compile(mesh.C())) | |||||
| { | |||||
| delete(m_ssetup); | |||||
| m_ssetup = new_ssetup; | |||||
| m_ssetup->Startup(); | |||||
| for (int i = 0; i < m_ssetup->m_custom_cmd.Count(); ++i) | |||||
| { | |||||
| if (m_ssetup->m_custom_cmd[i].m1 == "setmesh") | |||||
| { | |||||
| //Create a new mesh | |||||
| EasyMesh* em = new EasyMesh(); | |||||
| if (em->Compile(m_ssetup->m_custom_cmd[i].m2.C())) | |||||
| { | |||||
| if (m_mesh_id == m_meshes.Count() - 1) | |||||
| m_mesh_id++; | |||||
| m_meshes.Push(em); | |||||
| } | |||||
| else | |||||
| delete(em); | |||||
| } | |||||
| } | |||||
| m_ssetup->m_custom_cmd.Empty(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -448,7 +464,7 @@ public: | |||||
| if (m_stream_update_time > .0f) | if (m_stream_update_time > .0f) | ||||
| { | { | ||||
| m_stream_update_time = -1.f; | m_stream_update_time = -1.f; | ||||
| MessageService::Send(MessageBucket::AppIn, "[sc#f8f ab 1]"); | |||||
| // MessageService::Send(MessageBucket::AppIn, "[sc#f8f ab 1]"); | |||||
| // MessageService::Send(MessageBucket::AppIn, "[sc#f8f ab 1 splt 4 twy 90]"); | // MessageService::Send(MessageBucket::AppIn, "[sc#f8f ab 1 splt 4 twy 90]"); | ||||
| // MessageService::Send(MessageBucket::AppIn, "[sc#8ff afcb 1 1 1 0]"); | // MessageService::Send(MessageBucket::AppIn, "[sc#8ff afcb 1 1 1 0]"); | ||||
| // MessageService::Send(MessageBucket::AppIn, "[sc#ff8 afcb 1 1 1 0]"); | // MessageService::Send(MessageBucket::AppIn, "[sc#ff8 afcb 1 1 1 0]"); | ||||
| @@ -467,30 +483,13 @@ public: | |||||
| String cmd = f.ReadString(); | String cmd = f.ReadString(); | ||||
| f.Close(); | f.Close(); | ||||
| /* | |||||
| for (int i = 0; i < cmd.Count() - 1; i++) | |||||
| { | |||||
| if (cmd[i] == '/' && cmd[i + 1] == '/') | |||||
| { | |||||
| int j = i; | |||||
| for (; j < cmd.Count(); j++) | |||||
| { | |||||
| if (cmd[j] == '\r' || cmd[j] == '\n') | |||||
| break; | |||||
| } | |||||
| String new_cmd = cmd.Sub(0, i); | |||||
| if (j < cmd.Count()) | |||||
| new_cmd += cmd.Sub(j, cmd.Count() - j); | |||||
| cmd = new_cmd; | |||||
| i--; | |||||
| } | |||||
| } | |||||
| */ | |||||
| if (cmd.Count() | if (cmd.Count() | ||||
| && (!m_cmdlist.Count() || cmd != m_cmdlist.Last())) | && (!m_cmdlist.Count() || cmd != m_cmdlist.Last())) | ||||
| { | { | ||||
| m_cmdlist << cmd; | m_cmdlist << cmd; | ||||
| cmd = String(" addlight 0.0 position (4 -1 -4) color (.0 .2 .5 1) \ | |||||
| addlight 0.0 position (8 2 6) color #ffff \ | |||||
| custom setmesh \"") + cmd + "\""; | |||||
| MessageService::Send(MessageBucket::AppIn, cmd); | MessageService::Send(MessageBucket::AppIn, cmd); | ||||
| } | } | ||||
| } | } | ||||
| @@ -582,7 +581,7 @@ public: | |||||
| } | } | ||||
| private: | private: | ||||
| Array<Light *> m_lights; | |||||
| SceneSetup* m_ssetup; | |||||
| byte m_input_usage; | byte m_input_usage; | ||||
| Controller* m_controller; | Controller* m_controller; | ||||
| mat4 m_mat; | mat4 m_mat; | ||||
| @@ -620,8 +619,6 @@ private: | |||||
| float m_stream_update_time; | float m_stream_update_time; | ||||
| float m_stream_update_timer; | float m_stream_update_timer; | ||||
| Shader * m_test_shader; | |||||
| //misc datas | //misc datas | ||||
| Shader * m_texture_shader; | Shader * m_texture_shader; | ||||
| TileSet * m_default_texture; | TileSet * m_default_texture; | ||||
| @@ -43,7 +43,11 @@ | |||||
| </ProjectConfiguration> | </ProjectConfiguration> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ClCompile Include="generated\scenesetup-parser.cpp" /> | |||||
| <ClCompile Include="generated\scenesetup-scanner.cpp" /> | |||||
| <ClCompile Include="meshviewer.cpp" /> | <ClCompile Include="meshviewer.cpp" /> | ||||
| <ClCompile Include="scenesetup-compiler.cpp" /> | |||||
| <ClCompile Include="scenesetup.cpp" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ProjectReference Include="$(SolutionDir)\..\..\src\lolcore.vcxproj"> | <ProjectReference Include="$(SolutionDir)\..\..\src\lolcore.vcxproj"> | ||||
| @@ -63,6 +67,10 @@ | |||||
| <None Include="easy_mesh_dictionnary.js"> | <None Include="easy_mesh_dictionnary.js"> | ||||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | ||||
| </None> | </None> | ||||
| <None Include="generated\location.hh" /> | |||||
| <None Include="generated\position.hh" /> | |||||
| <None Include="generated\scenesetup-parser.output" /> | |||||
| <None Include="generated\stack.hh" /> | |||||
| <None Include="meshviewer_index.html"> | <None Include="meshviewer_index.html"> | ||||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | ||||
| </None> | </None> | ||||
| @@ -76,6 +84,8 @@ | |||||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | ||||
| </None> | </None> | ||||
| <None Include="progress_status.js" /> | <None Include="progress_status.js" /> | ||||
| <None Include="scenesetup-parser.y" /> | |||||
| <None Include="scenesetup-scanner.l" /> | |||||
| <None Include="type_dictionnary.js"> | <None Include="type_dictionnary.js"> | ||||
| <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | ||||
| </None> | </None> | ||||
| @@ -84,6 +94,11 @@ | |||||
| <LolFxCompile Include="shinyfur.lolfx" /> | <LolFxCompile Include="shinyfur.lolfx" /> | ||||
| <LolFxCompile Include="shinymvtexture.lolfx" /> | <LolFxCompile Include="shinymvtexture.lolfx" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | |||||
| <ClInclude Include="generated\scenesetup-parser.h" /> | |||||
| <ClInclude Include="scenesetup-compiler.h" /> | |||||
| <ClInclude Include="scenesetup.h" /> | |||||
| </ItemGroup> | |||||
| <PropertyGroup Label="Globals"> | <PropertyGroup Label="Globals"> | ||||
| <ProjectGuid>{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}</ProjectGuid> | <ProjectGuid>{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}</ProjectGuid> | ||||
| <ConfigurationType>Application</ConfigurationType> | <ConfigurationType>Application</ConfigurationType> | ||||
| @@ -104,6 +104,9 @@ progress::-webkit-progress-value | |||||
| //This is the module pointer : can be either the NaCl or Em one depending on the context. | //This is the module pointer : can be either the NaCl or Em one depending on the context. | ||||
| g_embed_module = null; | g_embed_module = null; | ||||
| g_mesh_code_base = "//This is a comment\nsc#f8f afcb 1 1 1 0"; | |||||
| g_scene_code_base = "//This is a comment\naddlight 0.0 position (4 -1 -4) color (.0 .2 .5 1) addlight 0.0 position (8 2 6) color #ffff"; | |||||
| function machinchose() { return 'test machin '; } | function machinchose() { return 'test machin '; } | ||||
| function GetTextAreaCodeSrc() { return g_txtarea_code_src; } | function GetTextAreaCodeSrc() { return g_txtarea_code_src; } | ||||
| function GetDivProgress() { return g_div_progress; } | function GetDivProgress() { return g_div_progress; } | ||||
| @@ -157,7 +160,7 @@ function machinchose() { return 'test machin '; } | |||||
| //Put here any cookie update | //Put here any cookie update | ||||
| if (!g_txtarea_code_src.value) | if (!g_txtarea_code_src.value) | ||||
| g_txtarea_code_src.value = "//This is a comment\nsc#f8f afcb 1 1 1 0"; | |||||
| g_txtarea_code_src.value = g_mesh_code_base; | |||||
| //Fill the TOC | //Fill the TOC | ||||
| if (!g_div_alphabet.innerHTML) | if (!g_div_alphabet.innerHTML) | ||||
| @@ -215,7 +218,7 @@ function machinchose() { return 'test machin '; } | |||||
| function SendMessageToModule() | function SendMessageToModule() | ||||
| { | { | ||||
| if (g_embed_module) | if (g_embed_module) | ||||
| g_embed_module.SendMessage(GetTextAreaCodeSrc().value); | |||||
| g_embed_module.SendMessage(g_scene_code_base + ' ' + GetTextAreaCodeSrc().value); | |||||
| else | else | ||||
| alert("Module not loaded !"); | alert("Module not loaded !"); | ||||
| } | } | ||||
| @@ -0,0 +1,55 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // (c) 2013 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include <string> | |||||
| #include "core.h" | |||||
| #include "scenesetup.h" | |||||
| #include "scenesetup-compiler.h" | |||||
| namespace lol | |||||
| { | |||||
| SceneSetupCompiler::SceneSetupCompiler(SceneSetup &uro) | |||||
| : m_sstp(uro), m_last_cmd("") | |||||
| { | |||||
| } | |||||
| bool SceneSetupCompiler::ParseString(char const *command) | |||||
| { | |||||
| SceneSetupScanner scanner(command); | |||||
| m_lexer = &scanner; | |||||
| SceneSetupParser parser(*this); | |||||
| if (parser.parse() != 0) | |||||
| { | |||||
| Log::Debug("Uro source: %s\n", command); | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| void SceneSetupCompiler::Error(const class location& l, const std::string& m) | |||||
| { | |||||
| Log::Error("SceneSetup syntax error line %d column %d: %s\n", | |||||
| l.begin.line, l.begin.column, m.c_str()); | |||||
| } | |||||
| void SceneSetupCompiler::Error(const std::string& m) | |||||
| { | |||||
| Log::Error("SceneSetup syntax error: %s\n", m.c_str()); | |||||
| } | |||||
| } /* namespace lol */ | |||||
| @@ -0,0 +1,63 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // (c) 2013 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #ifndef __SCENESETUP_COMPILER_H__ | |||||
| #define __SCENESETUP_COMPILER_H__ | |||||
| #include <string> | |||||
| #ifndef __FLEX_LEXER_H | |||||
| # define yyFlexLexer SceneSetupFlexLexer | |||||
| # include "FlexLexer.h" | |||||
| # undef yyFlexLexer | |||||
| #endif | |||||
| #include "generated/scenesetup-parser.h" | |||||
| class SceneSetup; | |||||
| namespace lol | |||||
| { | |||||
| //---- | |||||
| class SceneSetupScanner : public SceneSetupFlexLexer | |||||
| { | |||||
| public: | |||||
| SceneSetupScanner(char const *command); | |||||
| virtual ~SceneSetupScanner(); | |||||
| virtual int LexerInput(char* buf, int max_size); | |||||
| virtual SceneSetupParser::token_type lex(SceneSetupParser::semantic_type* yylval, | |||||
| SceneSetupParser::location_type* yylloc); | |||||
| private: | |||||
| char const *m_input; | |||||
| }; | |||||
| //---- | |||||
| class SceneSetupCompiler | |||||
| { | |||||
| public: | |||||
| SceneSetupCompiler(class SceneSetup &uro); | |||||
| bool ParseString(char const *command); | |||||
| void Error(const class location& l, const std::string& m); | |||||
| void Error(const std::string& m); | |||||
| class SceneSetupScanner* m_lexer; | |||||
| class SceneSetup& m_sstp; | |||||
| String m_last_cmd; | |||||
| }; | |||||
| } /* namespace lol */ | |||||
| #endif /* __SCENESETUP_COMPILER_H__ */ | |||||
| @@ -0,0 +1,200 @@ | |||||
| %{ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // (c) 2013 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "../scenesetup.h" | |||||
| %} | |||||
| %require "2.3" | |||||
| %debug | |||||
| %defines | |||||
| %skeleton "lalr1.cc" | |||||
| %name-prefix="lol" | |||||
| %define parser_class_name "SceneSetupParser" | |||||
| %locations | |||||
| %parse-param { class SceneSetupCompiler& uc } | |||||
| %error-verbose | |||||
| %union | |||||
| { | |||||
| float fval; | |||||
| int ival; | |||||
| bool bval; | |||||
| float vval[4]; | |||||
| int ivval[4]; | |||||
| char* sval; | |||||
| char* svval; | |||||
| /* Can't use uin32_t here for some reason */ | |||||
| unsigned u32val; | |||||
| } | |||||
| %start sstp_description | |||||
| %token T_COLOR | |||||
| %token T_ADDLIGHT T_OBJPOSITION T_OBJLOOKAT T_OBJCOLOR | |||||
| %token T_CUSTOMCMD | |||||
| %token T_END 0 | |||||
| %token T_ERROR | |||||
| %token <fval> F_NUMBER | |||||
| %token <ival> I_NUMBER | |||||
| %token <sval> STRING | |||||
| %token <svval> STRING_VAR | |||||
| %token <bval> BOOLEAN | |||||
| %token <u32val> COLOR | |||||
| /* Base Number types */ | |||||
| %type <fval> fv | |||||
| %type <ival> iv | |||||
| /* Vector types */ | |||||
| %type <vval> v3 | |||||
| %type <ivval> iv3 | |||||
| %type <vval> v4 | |||||
| /* Special types */ | |||||
| %type <bval> bv | |||||
| %type <sval> sv | |||||
| %type <svval> svv | |||||
| %{ | |||||
| #include "../scenesetup-compiler.h" | |||||
| #undef yylex | |||||
| #define yylex uc.m_lexer->lex | |||||
| /* HACK: workaround for Bison who insists on using exceptions */ | |||||
| #define try if (true) | |||||
| #define catch(...) if (false) | |||||
| #define throw (void)0 | |||||
| %} | |||||
| %% | |||||
| sstp_description: | |||||
| sstp_expression_list T_END | |||||
| ; | |||||
| sstp_expression_list: | |||||
| sstp_expression | |||||
| | sstp_expression sstp_expression_list | |||||
| ; | |||||
| sstp_expression: | |||||
| sstp_command_list | |||||
| ; | |||||
| sstp_command_list: | |||||
| sstp_command | |||||
| | sstp_command_list sstp_command | |||||
| ; | |||||
| sstp_command: | |||||
| light_command | |||||
| | setup_command | |||||
| | custom_command | |||||
| ; | |||||
| light_command: | |||||
| T_ADDLIGHT { uc.m_sstp.m_lights << new Light(); uc.m_last_cmd = "ADDLIGHT"; } | |||||
| | T_ADDLIGHT fv { uc.m_sstp.m_lights << new Light(); uc.m_last_cmd = "ADDLIGHT"; | |||||
| uc.m_sstp.m_lights.Last()->SetPosition(vec4(vec3::zero, $2)); } | |||||
| ; | |||||
| setup_command: | |||||
| T_OBJPOSITION v3 { if (uc.m_last_cmd == "ADDLIGHT") | |||||
| uc.m_sstp.m_lights.Last()->SetPosition(vec4(vec3($2[0], $2[1], $2[2]), uc.m_sstp.m_lights.Last()->GetPosition().w)); } | |||||
| | T_OBJLOOKAT v3 { if (uc.m_last_cmd == "ADDLIGHT") | |||||
| { /* */ } } | |||||
| | T_OBJCOLOR v4 { if (uc.m_last_cmd == "ADDLIGHT") | |||||
| uc.m_sstp.m_lights.Last()->SetColor(vec4($2[0], $2[1], $2[2], $2[3])); } | |||||
| | T_OBJCOLOR COLOR { uint32_t x = $2; | |||||
| ivec4 v(x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff); | |||||
| vec4 vv = vec4(v) * (1.f / 255.f); | |||||
| if (uc.m_last_cmd == "ADDLIGHT") | |||||
| uc.m_sstp.m_lights.Last()->SetColor(vv); } | |||||
| ; | |||||
| custom_command: | |||||
| T_CUSTOMCMD svv sv { uc.m_sstp.m_custom_cmd.Push($2, $3); } | |||||
| ; | |||||
| /* Base Number types */ | |||||
| fv: | |||||
| F_NUMBER { $$ = $1; } | |||||
| | '-' fv { $$ = -$2; } | |||||
| | I_NUMBER { $$ = (float)$1; } | |||||
| | '-' iv { $$ = -(float)$2; } | |||||
| ; | |||||
| iv: | |||||
| I_NUMBER { $$ = $1; } | |||||
| | '-' iv { $$ = -$2; } | |||||
| | F_NUMBER { $$ = (int)$1; } | |||||
| | '-' fv { $$ = -(int)$2; } | |||||
| ; | |||||
| /* Vector types */ | |||||
| v3: | |||||
| '('fv')' { $$[0] = $2; $$[1] = $2; $$[2] = $2; } | |||||
| | '('fv fv fv')' { $$[0] = $2; $$[1] = $3; $$[2] = $4; } | |||||
| ; | |||||
| iv3: | |||||
| '('iv')' { $$[0] = $2; $$[1] = $2; $$[2] = $2; } | |||||
| | '('iv iv iv')' { $$[0] = $2; $$[1] = $3; $$[2] = $4; } | |||||
| ; | |||||
| v4: | |||||
| '('fv')' { $$[0] = $2; $$[1] = $2; $$[2] = $2; $$[3] = $2; } | |||||
| | '('fv fv fv fv')' { $$[0] = $2; $$[1] = $3; $$[2] = $4; $$[3] = $5; } | |||||
| ; | |||||
| /* Special types */ | |||||
| bv: | |||||
| BOOLEAN { $$ = $1; } | |||||
| | I_NUMBER { $$ = !!$1; } | |||||
| | F_NUMBER { $$ = !!$1; } | |||||
| ; | |||||
| svv: | |||||
| STRING_VAR { $$ = $1; } | |||||
| ; | |||||
| sv: | |||||
| STRING { String t = $1; | |||||
| t.Replace('"', ' ', true); | |||||
| free($1); | |||||
| $$ = strdup((const char *)t.C()); } | |||||
| | STRING sv { String t = $1; | |||||
| t += $2; | |||||
| t.Replace('"', ' ', true); | |||||
| free($1); | |||||
| free($2); | |||||
| $$ = strdup((const char *)t.C()); } | |||||
| ; | |||||
| %% | |||||
| void lol::SceneSetupParser::error(const SceneSetupParser::location_type& l, | |||||
| const std::string& m) | |||||
| { | |||||
| uc.Error(l, m); | |||||
| } | |||||
| @@ -0,0 +1,144 @@ | |||||
| %{ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // (c) 2013 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include <cstdlib> | |||||
| using std::exit; | |||||
| using std::malloc; | |||||
| using std::realloc; | |||||
| using std::free; | |||||
| #include "core.h" | |||||
| #include "../scenesetup.h" | |||||
| #include "../scenesetup-compiler.h" | |||||
| typedef lol::SceneSetupParser::token token; | |||||
| typedef lol::SceneSetupParser::token_type token_type; | |||||
| #ifndef YY_DECL | |||||
| # define YY_DECL lol::SceneSetupParser::token_type \ | |||||
| lol::SceneSetupScanner::lex(lol::SceneSetupParser::semantic_type* yylval, \ | |||||
| lol::SceneSetupParser::location_type* yylloc) | |||||
| #endif | |||||
| #define yyterminate() return token::T_END | |||||
| #define YY_NO_UNISTD_H | |||||
| #define YY_USER_ACTION yylloc->columns(yyleng); | |||||
| %} | |||||
| %option c++ prefix="SceneSetup" | |||||
| %option batch yywrap nounput stack | |||||
| %% | |||||
| %{ /* reset location at the beginning of yylex() */ | |||||
| yylloc->step(); | |||||
| %} | |||||
| addlight { return token::T_ADDLIGHT; } | |||||
| position { return token::T_OBJPOSITION; } | |||||
| lookat { return token::T_OBJLOOKAT; } | |||||
| color { return token::T_OBJCOLOR; } | |||||
| custom { return token::T_CUSTOMCMD; } | |||||
| %{ /* ======= BASE COLOR TYPES ========================================= */ %} | |||||
| %{ /* COLOR */ %} | |||||
| #[0-9a-fA-F]{3} { | |||||
| uint32_t tmp = std::strtol(yytext + 1, nullptr, 16); | |||||
| yylval->u32val = 0x11000000u * (tmp >> 8) | |||||
| | 0x00110000u * ((tmp >> 4) & 0xf) | |||||
| | 0x00001100u * (tmp & 0xf) | |||||
| | 0x000000ffu; | |||||
| return token::COLOR; } | |||||
| #[0-9a-fA-F]{4} { | |||||
| uint32_t tmp = std::strtol(yytext + 1, nullptr, 16); | |||||
| yylval->u32val = 0x11000000u * (tmp >> 12) | |||||
| | 0x00110000u * ((tmp >> 8) & 0xf) | |||||
| | 0x00001100u * ((tmp >> 4) & 0xf) | |||||
| | 0x00000011u * (tmp & 0xf); | |||||
| return token::COLOR; } | |||||
| #[0-9a-fA-F]{6} { | |||||
| yylval->u32val = 0xffu | |||||
| | 0x100u * (uint32_t)std::strtol(yytext + 1, nullptr, 16); | |||||
| return token::COLOR; } | |||||
| #[0-9a-fA-F]{8} { | |||||
| yylval->u32val = (uint32_t)std::strtol(yytext + 1, nullptr, 16); | |||||
| return token::COLOR; } | |||||
| %{ /* ======= BASE DATA TYPES ========================================= */ %} | |||||
| %{ /* BOOL */ %} | |||||
| true { yylval->bval = true; return token::BOOLEAN; } | |||||
| false { yylval->bval = false; return token::BOOLEAN; } | |||||
| %{ /* FLOAT */ %} | |||||
| [-+]?[0-9]*\.[0-9]+([eE][-+]?[0-9]+)? { | |||||
| yylval->fval = (float)std::atof(yytext); return token::F_NUMBER; } | |||||
| %{ /* INT */ %} | |||||
| [-+]?[0-9]+ { | |||||
| yylval->ival = std::atoi(yytext); return token::I_NUMBER; } | |||||
| %{ /* STRING */ %} | |||||
| [\"][^\"]*[\"] { | |||||
| yylval->sval = strdup(yytext); return token::STRING; } | |||||
| %{ /* STRING VAR */ %} | |||||
| [a-zA-Z][a-zA-Z_\-]+ { | |||||
| yylval->svval = strdup(yytext); return token::STRING_VAR; } | |||||
| %{ /* ======= COMMENTS ======= */ %} | |||||
| "//"[^\n\r]*[\n\r] { /* ignore this */ } | |||||
| %{ /* Semantics tokens */ %} | |||||
| "-" { return token_type('-'); } | |||||
| "(" { return token_type('('); } | |||||
| ")" { return token_type(')'); } | |||||
| [ ,] { /* ignore this */ } | |||||
| [\n] { /* ignore this */ } | |||||
| . { return token::T_ERROR; } | |||||
| %% | |||||
| lol::SceneSetupScanner::SceneSetupScanner(char const *command) | |||||
| : SceneSetupFlexLexer(0, 0), | |||||
| m_input(command) | |||||
| { | |||||
| } | |||||
| lol::SceneSetupScanner::~SceneSetupScanner() | |||||
| { | |||||
| } | |||||
| int lol::SceneSetupScanner::LexerInput(char* buf, int max_size) | |||||
| { | |||||
| (void)max_size; /* unused for now */ | |||||
| buf[0] = m_input[0]; | |||||
| if (buf[0]) | |||||
| ++m_input; | |||||
| return buf[0] ? 1 : 0; | |||||
| } | |||||
| #ifdef yylex | |||||
| #undef yylex | |||||
| #endif | |||||
| int SceneSetupFlexLexer::yylex() | |||||
| { | |||||
| std::cerr << "in SceneSetupFlexLexer::yylex() !" << std::endl; | |||||
| return 0; | |||||
| } | |||||
| int SceneSetupFlexLexer::yywrap() | |||||
| { | |||||
| return 1; | |||||
| } | |||||
| @@ -0,0 +1,61 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // 2013 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "scenesetup.h" | |||||
| #include "scenesetup-compiler.h" | |||||
| namespace lol | |||||
| { | |||||
| //----------------------------------------------------------------------------- | |||||
| //CTor/DTor | |||||
| SceneSetup::SceneSetup() | |||||
| { | |||||
| } | |||||
| //---- | |||||
| SceneSetup::~SceneSetup() | |||||
| { | |||||
| Shutdown(true); | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| bool SceneSetup::Compile(char const *command) | |||||
| { | |||||
| SceneSetupCompiler mc(*this); | |||||
| return mc.ParseString(command); | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| bool SceneSetup::Startup() | |||||
| { | |||||
| for (int i = 0; i < m_lights.Count(); i++) | |||||
| Ticker::Ref(m_lights[i]); | |||||
| return true; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| bool SceneSetup::Shutdown(bool destroy) | |||||
| { | |||||
| for (int i = 0; i < m_lights.Count(); i++) | |||||
| Ticker::Unref(m_lights[i]); | |||||
| if (destroy) | |||||
| m_lights.Empty(); | |||||
| return true; | |||||
| } | |||||
| } /* namespace lol */ | |||||
| @@ -0,0 +1,48 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // (c) 2013 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| // | |||||
| // The Scene setup class | |||||
| // ---------------- | |||||
| // | |||||
| #if !defined __SCENESETUP_H__ | |||||
| #define __SCENESETUP_H__ | |||||
| namespace lol | |||||
| { | |||||
| class SceneSetup | |||||
| { | |||||
| friend class SceneSetupParser; | |||||
| public: | |||||
| //CTor/DTor | |||||
| SceneSetup(); | |||||
| ~SceneSetup(); | |||||
| static char const *GetName() { return "<scenesetup>"; } | |||||
| //-- | |||||
| bool Compile(char const *command); | |||||
| //-- | |||||
| bool Startup(); | |||||
| bool Shutdown(bool destroy=false); | |||||
| //private: | |||||
| Array<Light *> m_lights; | |||||
| Array<String, String> m_custom_cmd; | |||||
| }; | |||||
| } /* namespace lol */ | |||||
| #endif /* __SCENESETUP_H__ */ | |||||