@@ -109,7 +109,7 @@ typedef lol::EasyMeshParser::token_type token_type; | |||
(aq|addquad) { return token::T_QUAD; } | |||
(acg|addcog) { return token::T_COG; } | |||
%{ /* ======= BASE DATA TYPES ========================================= */ %} | |||
%{ /* ======= BASE COLOR TYPES ========================================= */ %} | |||
%{ /* COLOR */ %} | |||
#[0-9a-fA-F]{3} { | |||
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 "core.h" | |||
#include "scenesetup.h" | |||
using namespace std; | |||
using namespace lol; | |||
@@ -129,9 +130,12 @@ public: | |||
{ | |||
if (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(); | |||
m_ssetup = nullptr; | |||
m_camera = nullptr; | |||
} | |||
bool KeyReleased(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsReleased()); } | |||
@@ -228,15 +232,11 @@ public: | |||
g_scene->PushCamera(m_camera); | |||
//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 | |||
m_stream_update_time = 2.0f; | |||
@@ -433,14 +433,30 @@ public: | |||
int o = 1; | |||
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) | |||
{ | |||
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#8ff 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(); | |||
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() | |||
&& (!m_cmdlist.Count() || cmd != m_cmdlist.Last())) | |||
{ | |||
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); | |||
} | |||
} | |||
@@ -582,7 +581,7 @@ public: | |||
} | |||
private: | |||
Array<Light *> m_lights; | |||
SceneSetup* m_ssetup; | |||
byte m_input_usage; | |||
Controller* m_controller; | |||
mat4 m_mat; | |||
@@ -620,8 +619,6 @@ private: | |||
float m_stream_update_time; | |||
float m_stream_update_timer; | |||
Shader * m_test_shader; | |||
//misc datas | |||
Shader * m_texture_shader; | |||
TileSet * m_default_texture; | |||
@@ -43,7 +43,11 @@ | |||
</ProjectConfiguration> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ClCompile Include="generated\scenesetup-parser.cpp" /> | |||
<ClCompile Include="generated\scenesetup-scanner.cpp" /> | |||
<ClCompile Include="meshviewer.cpp" /> | |||
<ClCompile Include="scenesetup-compiler.cpp" /> | |||
<ClCompile Include="scenesetup.cpp" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="$(SolutionDir)\..\..\src\lolcore.vcxproj"> | |||
@@ -63,6 +67,10 @@ | |||
<None Include="easy_mesh_dictionnary.js"> | |||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
</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"> | |||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
</None> | |||
@@ -76,6 +84,8 @@ | |||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
</None> | |||
<None Include="progress_status.js" /> | |||
<None Include="scenesetup-parser.y" /> | |||
<None Include="scenesetup-scanner.l" /> | |||
<None Include="type_dictionnary.js"> | |||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
</None> | |||
@@ -84,6 +94,11 @@ | |||
<LolFxCompile Include="shinyfur.lolfx" /> | |||
<LolFxCompile Include="shinymvtexture.lolfx" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ClInclude Include="generated\scenesetup-parser.h" /> | |||
<ClInclude Include="scenesetup-compiler.h" /> | |||
<ClInclude Include="scenesetup.h" /> | |||
</ItemGroup> | |||
<PropertyGroup Label="Globals"> | |||
<ProjectGuid>{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}</ProjectGuid> | |||
<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. | |||
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 GetTextAreaCodeSrc() { return g_txtarea_code_src; } | |||
function GetDivProgress() { return g_div_progress; } | |||
@@ -157,7 +160,7 @@ function machinchose() { return 'test machin '; } | |||
//Put here any cookie update | |||
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 | |||
if (!g_div_alphabet.innerHTML) | |||
@@ -215,7 +218,7 @@ function machinchose() { return 'test machin '; } | |||
function SendMessageToModule() | |||
{ | |||
if (g_embed_module) | |||
g_embed_module.SendMessage(GetTextAreaCodeSrc().value); | |||
g_embed_module.SendMessage(g_scene_code_base + ' ' + GetTextAreaCodeSrc().value); | |||
else | |||
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__ */ |