From e70887f51141c88f030488d3fe5571549490297f Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Thu, 24 May 2012 17:00:36 +0000 Subject: [PATCH] test: more grammar improvements. --- test/sandbox/lex/Makefile | 2 + test/sandbox/lex/lolfx.l | 83 ++++++------------- test/sandbox/lex/lolfx.y | 169 +++++++++++++++++++++----------------- 3 files changed, 124 insertions(+), 130 deletions(-) diff --git a/test/sandbox/lex/Makefile b/test/sandbox/lex/Makefile index 265f202f..45db8e8c 100644 --- a/test/sandbox/lex/Makefile +++ b/test/sandbox/lex/Makefile @@ -8,3 +8,5 @@ lolfx.tab.c: lolfx.y lex.yy.c: lolfx.l flex -d $^ +clean: + rm -f lex.yy.c lolfx.tab.c lolfx.tab.h parser diff --git a/test/sandbox/lex/lolfx.l b/test/sandbox/lex/lolfx.l index 4c623636..f4123945 100644 --- a/test/sandbox/lex/lolfx.l +++ b/test/sandbox/lex/lolfx.l @@ -56,58 +56,11 @@ "isampler2dmsarray" { return GT_ISAMPLER2DMSARRAY; } "usampler2dmsarray" { return GT_USAMPLER2DMSARRAY; } -"identifier" { return GT_IDENTIFIER; } -"type_name" { return GT_TYPE_NAME; } -"floatconstant" { return GT_FLOATCONSTANT; } -"intconstant" { return GT_INTCONSTANT; } -"uintconstant" { return GT_UINTCONSTANT; } -"boolconstant" { return GT_BOOLCONSTANT; } - -"field_selection" { return GT_FIELD_SELECTION; } -"left_op" { return GT_LEFT_OP; } -"right_op" { return GT_RIGHT_OP; } -"and_op" { return GT_AND_OP; } -"or_op" { return GT_OR_OP; } -"xor_op" { return GT_XOR_OP; } -"mul_assign" { return GT_MUL_ASSIGN; } -"div_assign" { return GT_DIV_ASSIGN; } -"add_assign" { return GT_ADD_ASSIGN; } -"mod_assign" { return GT_MOD_ASSIGN; } -"left_assign" { return GT_LEFT_ASSIGN; } -"right_assign" { return GT_RIGHT_ASSIGN; } -"and_assign" { return GT_AND_ASSIGN; } -"xor_assign" { return GT_XOR_ASSIGN; } -"or_assign" { return GT_OR_ASSIGN; } -"sub_assign" { return GT_SUB_ASSIGN; } -"left_paren" { return GT_LEFT_PAREN; } -"right_paren" { return GT_RIGHT_PAREN; } -"left_bracket" { return GT_LEFT_BRACKET; } -"right_bracket" { return GT_RIGHT_BRACKET; } -"left_brace" { return GT_LEFT_BRACE; } -"right_brace" { return GT_RIGHT_BRACE; } -"dot" { return GT_DOT; } -"comma" { return GT_COMMA; } -"colon" { return GT_COLON; } -"equal" { return GT_EQUAL; } -"semicolon" { return GT_SEMICOLON; } -"bang" { return GT_BANG; } -"dash" { return GT_DASH; } -"tilde" { return GT_TILDE; } -"plus" { return GT_PLUS; } -"star" { return GT_STAR; } -"slash" { return GT_SLASH; } -"percent" { return GT_PERCENT; } -"left_angle" { return GT_LEFT_ANGLE; } -"right_angle" { return GT_RIGHT_ANGLE; } -"vertical_bar" { return GT_VERTICAL_BAR; } -"caret" { return GT_CARET; } -"ampersand" { return GT_AMPERSAND; } -"question" { return GT_QUESTION; } -"invariant" { return GT_INVARIANT; } -"high_precision" { return GT_HIGH_PRECISION; } -"medium_precision" { return GT_MEDIUM_PRECISION; } -"low_precision" { return GT_LOW_PRECISION; } +"highp" { return GT_HIGHP; } +"mediump" { return GT_MEDIUMP; } +"lowp" { return GT_LOWP; } "precision" { return GT_PRECISION; } +"invariant" { return GT_INVARIANT; } /* * GLSL vector types @@ -157,6 +110,17 @@ "dmat4x3" { return GT_DMAT4X3; } "dmat4x4" { return GT_DMAT4X4; } + /* + * GLSL constant values + */ + +"true" { yylval.ival = 1; return BOOLCONSTANT; } +"false" { yylval.ival = 0; return BOOLCONSTANT; } + +[xyzw]{1,4} { return FIELDSELECTION; } +[rgba]{1,4} { return FIELDSELECTION; } +[stpq]{1,4} { return FIELDSELECTION; } + /* * GLSL keywords that are also valid or reserved in HLSL * and HLSL keywords that are also valid or reserved in GLSL. @@ -469,6 +433,12 @@ "#"[ \t]*"pragma" { return PREPROCESSOR_PRAGMA; } "#"[ \t]*"undef" { return PREPROCESSOR_UNDEF; } + /* + * LolFx preprocessor directives + */ + +"#"[ \t]*"region" { return PREPROCESSOR_REGION; } + /* * HLSL reserved keywords * Gathered from http://msdn.microsoft.com/en-us/library/windows/desktop/bb509569%28v=vs.85%29.aspx @@ -534,15 +504,16 @@ "^=" { return T_XOREQ; } "|=" { return T_OREQ; } -[0-9]+\.[0-9]+ { yylval.fval = atof(yytext); return FLOAT; } -[0-9]+ { yylval.ival = atoi(yytext); return INT; } +(0|[1-9][0-9]*)\.[0-9]+ { yylval.fval = atof(yytext); return FLOATCONSTANT; } +(0|[1-9][0-9]*)[uU] { yylval.uval = atoi(yytext); return UINTCONSTANT; } +(0|[1-9][0-9]*) { yylval.ival = atoi(yytext); return INTCONSTANT; } + [a-zA-Z][a-zA-Z0-9_]* { /* Copy token for now */ yylval.sval = strdup(yytext); - return NAME; + return IDENTIFIER; } -[ \t\n]+ ; -"{"|"}"|"("|")"|"["|"]" { return *yytext; } +[ \t\n]+ { /* ignore whitespace */ } . { return *yytext; } /* diff --git a/test/sandbox/lex/lolfx.y b/test/sandbox/lex/lolfx.y index 1ad5c0cf..fe6f548d 100644 --- a/test/sandbox/lex/lolfx.y +++ b/test/sandbox/lex/lolfx.y @@ -14,43 +14,72 @@ void yyerror(const char *s); %union { int ival; + unsigned uval; float fval; char *sval; } +%type lolfx_shader_name + + /* + * GLSL and HLSL generic tokens + */ + +%token BOOLCONSTANT +%token INTCONSTANT +%token UINTCONSTANT +%token FLOATCONSTANT +%token /* TODO */ FIELDSELECTION +%token IDENTIFIER +%token TYPENAME + /* * GLSL keywords * FIXME: unsorted */ %token GT_SUBROUTINE GT_PATCH GT_SAMPLE GT_FLAT GT_SMOOTH GT_LAYOUT -%token GT_SAMPLER1DSHADOW GT_SAMPLER2DSHADOW GT_SAMPLERCUBESHADOW -%token GT_SAMPLER1DARRAY GT_SAMPLER2DARRAY GT_SAMPLER1DARRAYSHADOW -%token GT_SAMPLER2DARRAYSHADOW GT_ISAMPLER1D GT_ISAMPLER2D GT_ISAMPLER3D -%token GT_ISAMPLERCUBE GT_ISAMPLER1DARRAY GT_ISAMPLER2DARRAY GT_USAMPLER1D -%token GT_USAMPLER2D GT_USAMPLER3D GT_USAMPLERCUBE GT_USAMPLER1DARRAY -%token GT_USAMPLER2DARRAY GT_SAMPLER2DRECT GT_SAMPLER2DRECTSHADOW -%token GT_ISAMPLER2DRECT GT_USAMPLER2DRECT GT_SAMPLERBUFFER GT_ISAMPLERBUFFER -%token GT_USAMPLERBUFFER GT_SAMPLERCUBEARRAY GT_SAMPLERCUBEARRAYSHADOW -%token GT_ISAMPLERCUBEARRAY GT_USAMPLERCUBEARRAY GT_SAMPLER2DMS GT_ISAMPLER2DMS -%token GT_USAMPLER2DMS GT_SAMPLER2DMSARRAY GT_ISAMPLER2DMSARRAY -%token GT_USAMPLER2DMSARRAY GT_IDENTIFIER GT_TYPE_NAME GT_FLOATCONSTANT -%token GT_INTCONSTANT GT_UINTCONSTANT GT_BOOLCONSTANT GT_FIELD_SELECTION -%token GT_LEFT_OP GT_RIGHT_OP GT_INC_OP GT_DEC_OP GT_LE_OP GT_GE_OP GT_EQ_OP -%token GT_NE_OP GT_AND_OP GT_OR_OP GT_XOR_OP GT_MUL_ASSIGN GT_DIV_ASSIGN -%token GT_ADD_ASSIGN GT_MOD_ASSIGN GT_LEFT_ASSIGN GT_RIGHT_ASSIGN GT_AND_ASSIGN -%token GT_XOR_ASSIGN GT_OR_ASSIGN GT_SUB_ASSIGN GT_LEFT_PAREN GT_RIGHT_PAREN -%token GT_LEFT_BRACKET GT_RIGHT_BRACKET GT_LEFT_BRACE GT_RIGHT_BRACE GT_DOT -%token GT_COMMA GT_COLON GT_EQUAL GT_SEMICOLON GT_BANG GT_DASH GT_TILDE GT_PLUS -%token GT_STAR GT_SLASH GT_PERCENT GT_LEFT_ANGLE GT_RIGHT_ANGLE GT_VERTICAL_BAR -%token GT_CARET GT_AMPERSAND GT_QUESTION GT_INVARIANT GT_HIGH_PRECISION -%token GT_MEDIUM_PRECISION GT_LOW_PRECISION GT_PRECISION GT_BVEC2 GT_BVEC3 -%token GT_BVEC4 GT_IVEC2 GT_IVEC3 GT_IVEC4 GT_UVEC2 GT_UVEC3 GT_UVEC4 GT_VEC2 -%token GT_VEC3 GT_VEC4 GT_MAT2 GT_MAT2X2 GT_MAT2X3 GT_MAT2X4 GT_MAT3 GT_MAT3X2 -%token GT_MAT3X3 GT_MAT3X4 GT_MAT4 GT_MAT4X2 GT_MAT4X3 GT_MAT4X4 GT_DVEC2 -%token GT_DVEC3 GT_DVEC4 GT_DMAT2 GT_DMAT2X2 GT_DMAT2X3 GT_DMAT2X4 GT_DMAT3 -%token GT_DMAT3X2 GT_DMAT3X3 GT_DMAT3X4 GT_DMAT4 GT_DMAT4X2 GT_DMAT4X3 -%token GT_DMAT4X4 +%token GT_INVARIANT GT_HIGHP GT_MEDIUMP GT_LOWP GT_PRECISION + + /* + * GLSL types + */ + +%token GT_VEC2 GT_VEC3 GT_VEC4 +%token GT_BVEC2 GT_BVEC3 GT_BVEC4 +%token GT_DVEC2 GT_DVEC3 GT_DVEC4 +%token GT_IVEC2 GT_IVEC3 GT_IVEC4 +%token GT_UVEC2 GT_UVEC3 GT_UVEC4 + +%token GT_MAT2 GT_MAT2X2 GT_MAT2X3 GT_MAT2X4 +%token GT_MAT3 GT_MAT3X2 GT_MAT3X3 GT_MAT3X4 +%token GT_MAT4 GT_MAT4X2 GT_MAT4X3 GT_MAT4X4 +%token GT_DMAT2 GT_DMAT2X2 GT_DMAT2X3 GT_DMAT2X4 +%token GT_DMAT3 GT_DMAT3X2 GT_DMAT3X3 GT_DMAT3X4 +%token GT_DMAT4 GT_DMAT4X2 GT_DMAT4X3 GT_DMAT4X4 + +%token GT_SAMPLER1DSHADOW GT_SAMPLER1DARRAY GT_SAMPLER1DARRAYSHADOW +%token GT_SAMPLER2DSHADOW GT_SAMPLER2DARRAY GT_SAMPLER2DARRAYSHADOW +%token GT_SAMPLER2DRECT GT_SAMPLER2DRECTSHADOW +%token GT_SAMPLER2DMS GT_SAMPLER2DMSARRAY +%token GT_SAMPLERCUBESHADOW GT_SAMPLERCUBEARRAY GT_SAMPLERCUBEARRAYSHADOW +%token GT_SAMPLERBUFFER + +%token GT_ISAMPLER1D GT_ISAMPLER1DARRAY +%token GT_ISAMPLER2D GT_ISAMPLER2DARRAY +%token GT_ISAMPLER2DRECT +%token GT_ISAMPLER2DMS GT_ISAMPLER2DMSARRAY +%token GT_ISAMPLER3D +%token GT_ISAMPLERCUBE GT_ISAMPLERCUBEARRAY +%token GT_ISAMPLERBUFFER + +%token GT_USAMPLER1D GT_USAMPLER1DARRAY +%token GT_USAMPLER2D GT_USAMPLER2DARRAY +%token GT_USAMPLER2DRECT +%token GT_USAMPLER2DMS GT_USAMPLER2DMSARRAY +%token GT_USAMPLER3D +%token GT_USAMPLERCUBE GT_USAMPLERCUBEARRAY +%token GT_USAMPLERBUFFER /* * HLSL and GLSL keywords @@ -139,6 +168,7 @@ void yyerror(const char *s); %token PREPROCESSOR_ENDIF PREPROCESSOR_ERROR PREPROCESSOR_IF %token PREPROCESSOR_IFDEF PREPROCESSOR_IFNDEF PREPROCESSOR_INCLUDE %token PREPROCESSOR_LINE PREPROCESSOR_PRAGMA PREPROCESSOR_UNDEF +%token PREPROCESSOR_REGION /* * HLSL reserved keywords @@ -169,25 +199,25 @@ void yyerror(const char *s); %% -fx: - section_list +lolfx_file: + lolfx_section_list ; -section_list: - section - | section_list section +lolfx_section_list: + lolfx_section + | lolfx_section_list lolfx_section ; -section: - technique - | shader +lolfx_section: + lolfx_technique + | lolfx_shader ; /* * Grammar for techniques */ -technique: +lolfx_technique: HT_TECHNIQUE NAME '{' pass_list '}' { std::cout << "New tech" << std::endl; } ; @@ -217,12 +247,30 @@ pass_stmt: | NAME '[' INT ']' '=' INT ';' ; + /* + * Grammar for shaders + */ + +lolfx_shader: + lolfx_shader_region glsl_translation_unit + | lolfx_shader_region + ; + +lolfx_shader_region: + PREPROCESSOR_REGION lolfx_shader_name { std::cout << "new shader " << $2 << std::endl; } + ; + +lolfx_shader_name: + IDENTIFIER { $$ = $1; } + | lolfx_shader_name '.' IDENTIFIER { $$ = $3; } /* FIXME: concatenate */ + ; + /* * Grammar for GLSL */ glsl_variable_identifier: - GLSL_IDENTIFIER + IDENTIFIER ; glsl_primary_expression: @@ -238,7 +286,7 @@ glsl_postfix_expression: glsl_primary_expression | glsl_postfix_expression '[' glsl_integer_expression ']' | glsl_function_call - | glsl_postfix_expression '.' FIELD_SELECTION + | glsl_postfix_expression '.' FIELDSELECTION | glsl_postfix_expression T_INC | glsl_postfix_expression T_DEC ; @@ -278,7 +326,7 @@ glsl_function_call_header: glsl_function_identifier: glsl_type_specifier | IDENTIFIER - | FIELD_SELECTION + | FIELDSELECTION ; glsl_unary_expression: @@ -394,7 +442,7 @@ glsl_constant_expression: glsl_declaration: glsl_function_prototype ';' | glsl_init_declarator_list ';' - | PRECISION glsl_precision_qualifier glsl_type_specifier_no_prec ';' + | GT_PRECISION glsl_precision_qualifier glsl_type_specifier_no_prec ';' | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' ';' | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER ';' | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER '[' ']' ';' @@ -461,7 +509,7 @@ glsl_single_declaration: | glsl_fully_specified_type IDENTIFIER '[' ']' '=' glsl_initializer | glsl_fully_specified_type IDENTIFIER '[' glsl_constant_expression ']' '=' glsl_initializer | glsl_fully_specified_type IDENTIFIER '=' glsl_initializer - | INVARIANT IDENTIFIER + | GT_INVARIANT IDENTIFIER ; glsl_fully_specified_type: @@ -470,7 +518,7 @@ glsl_fully_specified_type: ; glsl_invariant_qualifier: - INVARIANT + GT_INVARIANT ; glsl_interpolation_qualifier: @@ -618,13 +666,13 @@ glsl_type_specifier_nonarray: | GT_ISAMPLER2DMSARRAY | GT_USAMPLER2DMSARRAY | glsl_struct_specifier - | TYPE_NAME + | TYPENAME ; glsl_precision_qualifier: - HIGH_PRECISION - | MEDIUM_PRECISION - | LOW_PRECISION + GT_HIGHP + | GT_MEDIUMP + | GT_LOWP ; glsl_struct_specifier: @@ -760,7 +808,7 @@ glsl_jump_statement: glsl_translation_unit: glsl_external_declaration - glsl_translation_unit glsl_external_declaration + | glsl_translation_unit glsl_external_declaration ; glsl_external_declaration: @@ -772,33 +820,6 @@ glsl_function_definition: glsl_function_prototype glsl_compound_statement_no_new_scope ; - /* - * 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()