@@ -15,7 +15,7 @@ | |||||
<!-- We should use %(RelativeDir) here but for some reason it's an _absolute_ dir. WTF. --> | <!-- We should use %(RelativeDir) here but for some reason it's an _absolute_ dir. WTF. --> | ||||
<ObjectFileName>$(IntDir)/%(Directory)/</ObjectFileName> | <ObjectFileName>$(IntDir)/%(Directory)/</ObjectFileName> | ||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\src;$(SolutionDir)\..\src\bullet;$(SolutionDir)\..\tools\lolunit;$(FlexIncludes);$(BtPhysIncludes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\src;$(SolutionDir)\..\src\bullet;$(SolutionDir)\..\tools\lolunit;$(PegtlIncludes);$(FlexIncludes);$(BtPhysIncludes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||||
<AdditionalIncludeDirectories Condition="'$(Platform)'=='Win32'">$(GlIncludes);$(SdlIncludes);$(FfmpegIncludes);$(D3d9Includes);$(XinputIncludes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | <AdditionalIncludeDirectories Condition="'$(Platform)'=='Win32'">$(GlIncludes);$(SdlIncludes);$(FfmpegIncludes);$(D3d9Includes);$(XinputIncludes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
<AdditionalIncludeDirectories Condition="'$(Platform)'=='x64'">$(GlIncludes);$(SdlIncludes);$(FfmpegIncludes);$(D3d9Includes);$(XinputIncludes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | <AdditionalIncludeDirectories Condition="'$(Platform)'=='x64'">$(GlIncludes);$(SdlIncludes);$(FfmpegIncludes);$(D3d9Includes);$(XinputIncludes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
<PreprocessorDefinitions>NOMINMAX;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | <PreprocessorDefinitions>NOMINMAX;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
@@ -8,6 +8,10 @@ | |||||
<FlexDir>$(ExternalDir)\flex-2.5.35</FlexDir> | <FlexDir>$(ExternalDir)\flex-2.5.35</FlexDir> | ||||
<FlexIncludes>$(FlexDir)\include</FlexIncludes> | <FlexIncludes>$(FlexDir)\include</FlexIncludes> | ||||
<!-- PEGTL --> | |||||
<PegtlDir>$(ExternalDir)\pegtl-0.32</PegtlDir> | |||||
<PegtlIncludes>$(PegtlDir)\include</PegtlIncludes> | |||||
<!-- libgcc (from mingw-w64) --> | <!-- libgcc (from mingw-w64) --> | ||||
<LibGccDir>$(ExternalDir)\libgcc-4.9</LibGccDir> | <LibGccDir>$(ExternalDir)\libgcc-4.9</LibGccDir> | ||||
<LibGccLibs Condition="'$(Platform)'=='Win32'">$(LibGccDir)\lib\i686-w64-mingw32</LibGccLibs> | <LibGccLibs Condition="'$(Platform)'=='Win32'">$(LibGccDir)\lib\i686-w64-mingw32</LibGccLibs> | ||||
@@ -109,6 +113,8 @@ | |||||
<BuildMacro Include="ExternalDir"><Value>$(ExternalDir)</Value></BuildMacro> | <BuildMacro Include="ExternalDir"><Value>$(ExternalDir)</Value></BuildMacro> | ||||
<BuildMacro Include="FlexDir"><Value>$(FlexDir)</Value></BuildMacro> | <BuildMacro Include="FlexDir"><Value>$(FlexDir)</Value></BuildMacro> | ||||
<BuildMacro Include="FlexIncludes"><Value>$(FlexIncludes)</Value></BuildMacro> | <BuildMacro Include="FlexIncludes"><Value>$(FlexIncludes)</Value></BuildMacro> | ||||
<BuildMacro Include="PegtlDir"><Value>$(PegtlDir)</Value></BuildMacro> | |||||
<BuildMacro Include="PegtlIncludes"><Value>$(PegtlIncludes)</Value></BuildMacro> | |||||
<BuildMacro Include="LibGccDir"><Value>$(LibGccDir)</Value></BuildMacro> | <BuildMacro Include="LibGccDir"><Value>$(LibGccDir)</Value></BuildMacro> | ||||
<BuildMacro Include="LibGccLibs"><Value>$(LibGccLibs)</Value></BuildMacro> | <BuildMacro Include="LibGccLibs"><Value>$(LibGccLibs)</Value></BuildMacro> | ||||
<BuildMacro Include="LibGccDeps"><Value>$(LibGccDeps)</Value></BuildMacro> | <BuildMacro Include="LibGccDeps"><Value>$(LibGccDeps)</Value></BuildMacro> | ||||
@@ -143,9 +143,8 @@ else | |||||
AC_DEFINE(LOL_BUILD_RELEASE, 1, Define to 1 to activate final release) | AC_DEFINE(LOL_BUILD_RELEASE, 1, Define to 1 to activate final release) | ||||
LOL_TRY_CXXFLAGS(-Os, [AM_CXXFLAGS="${AM_CXXFLAGS} -Os"]) | LOL_TRY_CXXFLAGS(-Os, [AM_CXXFLAGS="${AM_CXXFLAGS} -Os"]) | ||||
LOL_TRY_CXXFLAGS(-ffast-math, [AM_CXXFLAGS="${AM_CXXFLAGS} -ffast-math"]) | LOL_TRY_CXXFLAGS(-ffast-math, [AM_CXXFLAGS="${AM_CXXFLAGS} -ffast-math"]) | ||||
dnl Removed this so .nexe build ok. | |||||
dnl LOL_TRY_CXXFLAGS(-fomit-frame-pointer, [AM_CXXFLAGS="${AM_CXXFLAGS} -fomit-frame-pointer"]) | |||||
dnl LOL_TRY_CXXFLAGS(-fno-strength-reduce, [AM_CXXFLAGS="${AM_CXXFLAGS} -fno-strength-reduce"]) | |||||
LOL_TRY_CXXFLAGS(-fomit-frame-pointer, [AM_CXXFLAGS="${AM_CXXFLAGS} -fomit-frame-pointer"]) | |||||
LOL_TRY_CXXFLAGS(-fno-strength-reduce, [AM_CXXFLAGS="${AM_CXXFLAGS} -fno-strength-reduce"]) | |||||
fi | fi | ||||
@@ -191,10 +190,6 @@ AM_CONDITIONAL(USE_LATEX, test "${LATEX}" != "no") | |||||
AM_CONDITIONAL(USE_DOT, test "${DOT}" != "no") | AM_CONDITIONAL(USE_DOT, test "${DOT}" != "no") | ||||
dnl No exceptions… | |||||
LOL_TRY_CXXFLAGS(-fno-exceptions, [AM_CXXFLAGS="${AM_CXXFLAGS} -fno-exceptions"]) | |||||
LOL_TRY_CXXFLAGS(-fno-rtti, [AM_CXXFLAGS="${AM_CXXFLAGS} -fno-rtti"]) | |||||
dnl Debug symbols | dnl Debug symbols | ||||
LOL_TRY_LDFLAGS(-rdynamic, [AM_LDFLAGS="${AM_LDFLAGS} -rdynamic"]) | LOL_TRY_LDFLAGS(-rdynamic, [AM_LDFLAGS="${AM_LDFLAGS} -rdynamic"]) | ||||
@@ -353,6 +348,13 @@ if test "x${ac_cv_my_have_flexlexer_h}" = "xno"; then | |||||
fi | fi | ||||
dnl Use pegtl? Yes, always | |||||
if true; then | |||||
LOL_CFLAGS="$LOL_CFLAGS -I\$(top_srcdir)/external/pegtl-0.32/include" | |||||
LOL_CFLAGS="$LOL_CFLAGS -I\$(top_srcdir)/external/axe-1.5.4.164/include" | |||||
fi | |||||
dnl Use NativeClient? | dnl Use NativeClient? | ||||
ac_cv_my_have_nacl="no" | ac_cv_my_have_nacl="no" | ||||
AC_LANG_PUSH(C++) | AC_LANG_PUSH(C++) | ||||
@@ -1,11 +1,13 @@ | |||||
// | // | ||||
// Lol Engine - Sandbox program | |||||
// Lol Engine - Sandbox program | |||||
// | // | ||||
// Copyright: (c) 2005-2011 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. | |||||
// Copyright © 2005-2015 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// This program is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#if HAVE_CONFIG_H | #if HAVE_CONFIG_H | ||||
@@ -14,22 +16,151 @@ | |||||
#include <lol/engine.h> | #include <lol/engine.h> | ||||
#include "pegtl.hh" | |||||
namespace lol { namespace parser = pegtl; } | |||||
#include "axe.h" | |||||
namespace lol { using namespace axe; } | |||||
using namespace lol; | using namespace lol; | ||||
int main(int argc, char **argv) | |||||
// | |||||
// Parser tools for a simple calculator grammar with + - * / | |||||
// | |||||
struct calculator | |||||
{ | { | ||||
ivec2 size(128, 128); | |||||
void push(double d) { stack.Push(d); } | |||||
void pop() { printf("%f\n", stack.Pop()); } | |||||
if (argc > 1) | |||||
size.x = size.y = atoi(argv[1]); | |||||
if (argc > 2) | |||||
size.y = atoi(argv[2]); | |||||
void mul() { auto x = stack.Pop(); stack.Push(stack.Pop() * x); } | |||||
void div() { auto x = stack.Pop(); stack.Push(stack.Pop() / x); } | |||||
void add() { auto x = stack.Pop(); stack.Push(stack.Pop() + x); } | |||||
void sub() { auto x = stack.Pop(); stack.Push(stack.Pop() - x); } | |||||
array2d<float> vac = Image::BlueNoiseKernel(size); | |||||
for (int y = 0; y < size.y; ++y) | |||||
for (int x = 0; x < size.x; ++x) | |||||
printf("%d %d %f\n", x, y, vac[x][y]); | |||||
array<double> stack; | |||||
}; | |||||
static void parse_pegtl(std::string const &str); | |||||
static void parse_axe(std::string const &str); | |||||
int main() | |||||
{ | |||||
std::string const str("42+2*(1-1+2+3-4*5)"); | |||||
parse_axe(str); | |||||
parse_pegtl(str); | |||||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||||
} | } | ||||
// | |||||
// PegTL -- a PEG parser | |||||
// | |||||
namespace pegtl_parser | |||||
{ | |||||
using namespace lol::parser; | |||||
#define ACTION(name, code) \ | |||||
struct name : action_base<name> { \ | |||||
static void apply(std::string const &ctx, calculator &c) { \ | |||||
code \ | |||||
} \ | |||||
}; | |||||
ACTION( do_number, c.push(atof(ctx.c_str())); ) | |||||
ACTION( do_op, | |||||
switch (ctx[0]) | |||||
{ | |||||
case '*': c.mul(); break; | |||||
case '/': c.div(); break; | |||||
case '+': c.add(); break; | |||||
case '-': c.sub(); break; | |||||
} ) | |||||
ACTION( do_success, c.pop(); ) | |||||
#undef ACTION | |||||
// number <- <digit> + | |||||
struct number : ifapply<plus<digit>, do_number> {}; | |||||
// term <- number | "(" expr ")" | |||||
struct term : sor<number, | |||||
seq<one<'('>, struct expr, one<')'>>> {}; | |||||
// factor <- term ( "*" term | "/" term ) * | |||||
struct factor : seq<term, | |||||
star<ifapply<sor<seq<one<'*'>, term>, | |||||
seq<one<'/'>, term>>, do_op>>> {}; | |||||
// expr <- factor ( "+" factor | "-" factor ) * | |||||
struct expr : seq<factor, | |||||
star<ifapply<sor<seq<one<'+'>, factor>, | |||||
seq<one<'-'>, factor>>, do_op>>> {}; | |||||
// stmt <- expr <end> | |||||
struct stmt : ifapply<seq<expr, eof>, do_success> {}; | |||||
}; | |||||
static void parse_pegtl(std::string const & str) | |||||
{ | |||||
calculator c; | |||||
pegtl::basic_parse_string<pegtl_parser::stmt>(str, c); | |||||
} | |||||
// | |||||
// AXE -- a recursive descent parser (needs right-recursion) | |||||
// | |||||
template<typename IT> | |||||
static void parse_axe_helper(IT i1, IT i2) | |||||
{ | |||||
calculator c; | |||||
double d; | |||||
#define ACTION(code) e_ref([&](...) { code }) | |||||
r_rule<IT> number, term, factor, factor_tail, expr, expr_tail, stmt; | |||||
// number ::= <double> | |||||
number = r_double(d) >> ACTION( c.push(d); ); | |||||
// term ::= number | ( expr ) | |||||
term = number | |||||
| '(' & expr & ')'; | |||||
// factor ::= term factor_tail | |||||
// factor_tail ::= * term factor_tail | |||||
// | / term factor_tail | |||||
// | ɛ | |||||
factor_tail = '*' & term >> ACTION( c.mul(); ) & factor_tail | |||||
| '/' & term >> ACTION( c.div(); ) & factor_tail | |||||
| r_empty(); | |||||
factor = term & factor_tail; | |||||
// expr ::= factor expr_tail | |||||
// expr_tail ::= + factor expr_tail | |||||
// | - factor expr_tail | |||||
// | ɛ | |||||
expr_tail = '+' & factor >> ACTION( c.add(); ) & expr_tail | |||||
| '-' & factor >> ACTION( c.sub(); ) & expr_tail | |||||
| r_empty(); | |||||
expr = factor & expr_tail; | |||||
// stmt ::= expr <end> | |||||
// | <fail> | |||||
stmt = expr & r_end() >> ACTION( c.pop(); ) | |||||
| r_fail([](...) { printf("malformed expression\n"); }); | |||||
#undef ACTION | |||||
// Evaluate expression | |||||
stmt(i1, i2); | |||||
} | |||||
static void parse_axe(std::string const &str) | |||||
{ | |||||
return parse_axe_helper(str.begin(), str.end()); | |||||
} | |||||