| @@ -0,0 +1,4 @@ | |||
| lex.yy.c | |||
| lolfx.tab.c | |||
| lolfx.tab.h | |||
| parser | |||
| @@ -0,0 +1,10 @@ | |||
| parser: lex.yy.c lolfx.tab.c | |||
| $(CXX) $^ -o $@ -lfl | |||
| lolfx.tab.c: lolfx.y | |||
| bison -d $^ | |||
| lex.yy.c: lolfx.l | |||
| flex -d $^ | |||
| @@ -0,0 +1,50 @@ | |||
| %{ | |||
| #include <iostream> | |||
| #define YY_DECL extern "C" int yylex() | |||
| #include "lolfx.tab.h" | |||
| %} | |||
| %x C_COMMENT | |||
| %x CPP_COMMENT | |||
| %% | |||
| /* | |||
| * Our language's keywords | |||
| */ | |||
| "technique" { return TECHNIQUE; } | |||
| "pass" { return PASS; } | |||
| /* | |||
| * Various tokens | |||
| */ | |||
| [0-9]+\.[0-9]+ { yylval.fval = atof(yytext); return FLOAT; } | |||
| [0-9]+ { yylval.ival = atoi(yytext); return INT; } | |||
| [a-zA-Z][a-zA-Z0-9_]* { | |||
| /* Copy token for now */ | |||
| yylval.sval = strdup(yytext); | |||
| return NAME; | |||
| } | |||
| [ \t\n]+ ; | |||
| . { return *yytext; } | |||
| /* | |||
| * Ignore C comments | |||
| */ | |||
| "/*" { BEGIN(C_COMMENT); } | |||
| <C_COMMENT>"*/" { BEGIN(INITIAL); } | |||
| <C_COMMENT>[^*]* { } | |||
| <C_COMMENT>. { } | |||
| /* | |||
| * Ignore C++ comments | |||
| */ | |||
| "//" { BEGIN(CPP_COMMENT); } | |||
| <CPP_COMMENT>.*\n { BEGIN(INITIAL); } | |||
| %% | |||
| @@ -0,0 +1,126 @@ | |||
| %{ | |||
| #include <cstdio> | |||
| #include <iostream> | |||
| extern "C" int yylex(); | |||
| extern "C" int yyparse(); | |||
| extern "C" FILE *yyin; | |||
| extern "C" int yylineno; | |||
| void yyerror(const char *s); | |||
| %} | |||
| /* The classic Bison union trick */ | |||
| %union | |||
| { | |||
| int ival; | |||
| float fval; | |||
| char *sval; | |||
| } | |||
| /* | |||
| * All the LolFx tokens | |||
| */ | |||
| %token TECHNIQUE PASS | |||
| %token <ival> INT | |||
| %token <fval> FLOAT | |||
| %token <sval> STRING NAME | |||
| %% | |||
| fx: | |||
| section_list | |||
| ; | |||
| section_list: | |||
| section | |||
| | section_list section | |||
| ; | |||
| section: | |||
| technique | |||
| | shader | |||
| ; | |||
| /* | |||
| * Grammar for techniques | |||
| */ | |||
| technique: | |||
| TECHNIQUE NAME '{' pass_list '}' { std::cout << "TECHNIQUE" << std::endl; } | |||
| ; | |||
| /* | |||
| * Grammar for passes | |||
| */ | |||
| pass_list: | |||
| pass | |||
| | pass_list pass | |||
| ; | |||
| pass: | |||
| PASS NAME '{' pass_stmt_list '}' { std::cout << "PASS" << std::endl; } | |||
| ; | |||
| pass_stmt_list: | |||
| pass_stmt | |||
| | pass_stmt_list pass_stmt | |||
| ; | |||
| pass_stmt: | |||
| ';' | |||
| | NAME '=' NAME ';' | |||
| | NAME '=' INT ';' | |||
| | NAME '[' INT ']' '=' NAME ';' | |||
| | NAME '[' INT ']' '=' INT ';' | |||
| ; | |||
| /* | |||
| * Grammar for shaders | |||
| */ | |||
| shader: | |||
| shader_region shader_code | |||
| | shader_region | |||
| ; | |||
| shader_region: | |||
| '#' NAME shader_name { std::cout << "new shader " << $2 << std::endl; } | |||
| ; | |||
| shader_name: | |||
| NAME | |||
| | shader_name '.' NAME | |||
| ; | |||
| shader_code: | |||
| INT shader_code { std::cout << "int: " << $1 << std::endl; } | |||
| | FLOAT shader_code { std::cout << "float: " << $1 << std::endl; } | |||
| | STRING shader_code { std::cout << "string: " << $1 << std::endl; } | |||
| | INT { std::cout << "int: " << $1 << std::endl; } | |||
| | FLOAT { std::cout << "float: " << $1 << std::endl; } | |||
| | STRING { std::cout << "string: " << $1 << std::endl; } | |||
| ; | |||
| %% | |||
| main() | |||
| { | |||
| yyin = fopen("test.lolfx", "r"); | |||
| do | |||
| { | |||
| yyparse(); | |||
| } | |||
| while (!feof(yyin)); | |||
| fclose(yyin); | |||
| } | |||
| void yyerror(const char *s) | |||
| { | |||
| std::cout << "Parse error line " << yylineno << ": " << s << std::endl; | |||
| exit(-1); | |||
| } | |||
| @@ -0,0 +1,103 @@ | |||
| /* | |||
| * LolFx Test Material | |||
| */ | |||
| // Can have lots of different techniques in a single lolfx file, | |||
| // especially if they share common shader code. | |||
| technique Foo | |||
| { | |||
| // Multiple passes, with alpha on/off, with various blending methods, | |||
| // with depth test disabled... | |||
| pass p0 | |||
| { | |||
| texture[0] = null; | |||
| texture[1] = null; | |||
| texture[2] = null; | |||
| cullmode = none; // ccw | |||
| lighting = false; | |||
| zenable = true; // false | |||
| alphablendenable = true; // false | |||
| srcblend = src_alpha; // one | |||
| destblend = inv_src_alpha; | |||
| colorop[0] = select_arg1; | |||
| colorarg1[0] = diffuse; | |||
| alphaop[0] = select_arg1; | |||
| alphaarg1[0] = diffuse; | |||
| colorop[1] = disable; | |||
| alphaop[1] = disable; | |||
| // Ye old way | |||
| vertexshader = blah; | |||
| geometryshader = blah; | |||
| pixelshader = blah; | |||
| // Ogre crap | |||
| // The D3D11 way, but we must make it work with GLSL too | |||
| //SetBlendState(AdditiveBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); | |||
| //SetDepthStencilState(DisableDepth, 0); | |||
| //SetRasterizerState() | |||
| //SetVertexShader | |||
| //SetDomainShader | |||
| //SetHullShader | |||
| //SetGeometryShader | |||
| //SetPixelShader | |||
| //SetComputeShader /* WTF? */ | |||
| //SetRenderTargets(RTV0, DSV); | |||
| //SetRenderTargets(RTV0, RTV1, DSV); | |||
| //... | |||
| //SetRenderTargets(RTV0, RTV1, RTV2, RTV3, RTV4, RTV5, RTV6, RTV7, DSV); | |||
| } | |||
| pass p1 | |||
| { | |||
| // Autres vertex/pixel shaders avec éventuellement des | |||
| // dépendances sur le résultat des passes précédentes | |||
| vertexshader = something_else; | |||
| } | |||
| } | |||
| /* Defines GLSL shader "Prout" */ | |||
| #section GLSL.Prout | |||
| #version 120 | |||
| /* Valid with my GLSL compiler */ | |||
| #pragma lolfx semantic(in_Vertex, POSITION) | |||
| #pragma lolfx semantic(in_Normal, NORMAL) | |||
| #pragma lolfx semantic(in_Color, COLOR) | |||
| attribute vec3 in_Vertex; | |||
| attribute vec3 in_Normal; | |||
| attribute vec4 in_Color; | |||
| void main(void) | |||
| { | |||
| ... | |||
| } | |||
| /* Defines GLSL shader "Zob" */ | |||
| #section GLSL.Zob | |||
| void main(void) | |||
| { | |||
| shit fuck fuck shit; | |||
| } | |||
| /* Defines HLSL shader "Prout" */ | |||
| #section HLSL.Prout | |||
| void main(void) | |||
| { | |||
| /* Blah */ | |||
| } | |||