Browse Source

test: more grammar improvements.

legacy
Sam Hocevar sam 12 years ago
parent
commit
e70887f511
3 changed files with 124 additions and 130 deletions
  1. +2
    -0
      test/sandbox/lex/Makefile
  2. +27
    -56
      test/sandbox/lex/lolfx.l
  3. +95
    -74
      test/sandbox/lex/lolfx.y

+ 2
- 0
test/sandbox/lex/Makefile View File

@@ -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

+ 27
- 56
test/sandbox/lex/lolfx.l View File

@@ -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; }

/*


+ 95
- 74
test/sandbox/lex/lolfx.y View File

@@ -14,43 +14,72 @@ void yyerror(const char *s);
%union
{
int ival;
unsigned uval;
float fval;
char *sval;
}

%type <sval> lolfx_shader_name

/*
* GLSL and HLSL generic tokens
*/

%token <ival> BOOLCONSTANT
%token <ival> INTCONSTANT
%token <uval> UINTCONSTANT
%token <fval> FLOATCONSTANT
%token /* TODO */ FIELDSELECTION
%token <sval> IDENTIFIER
%token <sval> 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()


Loading…
Cancel
Save