@@ -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 */ | |||||
} | |||||