summaryrefslogtreecommitdiffstats
path: root/o3d/compiler/hlsl/HLSL.g
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/compiler/hlsl/HLSL.g')
-rw-r--r--o3d/compiler/hlsl/HLSL.g1020
1 files changed, 1020 insertions, 0 deletions
diff --git a/o3d/compiler/hlsl/HLSL.g b/o3d/compiler/hlsl/HLSL.g
new file mode 100644
index 0000000..7477b0d
--- /dev/null
+++ b/o3d/compiler/hlsl/HLSL.g
@@ -0,0 +1,1020 @@
+/*
+ * Copyright 2009, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+// This file contains the ANTLR grammar for parsing HLSL into an Abstract
+// Syntax Tree (AST).
+
+grammar HLSL;
+
+options {
+ language = Java;
+ }
+
+@header
+{
+}
+
+translation_unit
+ : ( global_declaration )* (technique)* EOF
+ ;
+
+global_declaration
+ : (function_storage_class? function_type_specifier ID LPAREN) => function_declaration
+ | sampler_declaration
+ | texture_declaration
+ | struct_definition
+ | typedef_definition
+ | var_declaration
+ ;
+
+// variables -------------------------------------------
+
+var_declaration
+ : var_storage_class*
+ var_type_modifier?
+ var_datatype id_declaration
+ semantic?
+ annotation_list?
+ ('=' initializer)?
+ var_packoffset?
+ var_register_bind?
+ SEMI
+ ;
+
+var_storage_class
+ : 'extern'
+ | 'nointerpolation'
+ | 'shared'
+ | 'static'
+ | 'uniform'
+ | 'volatile'
+ ;
+
+var_type_modifier
+ : ('const'|'row_major'|'column_major');
+
+var_datatype
+ : buffer_type_specifier
+ | scalar_type_or_string_specifier
+ | vector_type_specifier
+ | matrix_type_specifier
+ | struct_type_specifier
+ ;
+
+var_packoffset
+ : 'packoffset' LPAREN register_name (DOT vector_subcomponent)? RPAREN
+ ;
+
+var_register_bind
+ : COLON register_name
+ ;
+
+id_declaration
+ : ID ( LBRACKET constant_expression RBRACKET )?
+ ;
+
+// function --------------------------------------------
+
+function_declaration
+ : function_storage_class?
+ function_type_specifier ID LPAREN argument_list RPAREN semantic?
+ function_body (SEMI)?
+ ;
+
+function_storage_class
+ : 'inline' // ignoring platform target
+ ;
+
+function_type_specifier
+ : scalar_type_specifier
+ | vector_type_specifier
+ | matrix_type_specifier
+ | struct_type_specifier
+ | 'void'
+ ;
+
+semantic
+ : COLON semantic_specifier ;
+
+param_type_specifier
+ : scalar_type_specifier
+ | vector_type_specifier
+ | matrix_type_specifier
+ | struct_type_specifier
+ | string_type_specifier
+ ;
+
+// typedef ---------------------------------------
+
+typedef_definition
+ : 'typedef'
+ ;
+
+// basic datatypes -------------------------------
+
+buffer_type_specifier
+ : ('buffer' '<' var_datatype '>' ID)
+ ;
+
+scalar_type_specifier
+ : 'bool'
+ | 'int'
+ | 'uint'
+ | 'half'
+ | 'float'
+ | 'double'
+ ;
+
+scalar_type_or_string_specifier
+ : scalar_type_specifier
+ | string_type_specifier
+ ;
+
+vector_type_specifier
+ : 'bool1'
+ | 'bool2'
+ | 'bool3'
+ | 'bool4'
+ | 'int1'
+ | 'int2'
+ | 'int3'
+ | 'int4'
+ | 'uint1'
+ | 'uint2'
+ | 'uint3'
+ | 'uint4'
+ | 'half1'
+ | 'half2'
+ | 'half3'
+ | 'half4'
+ | 'float1'
+ | 'float2'
+ | 'float3'
+ | 'float4'
+ | 'double1'
+ | 'double2'
+ | 'double3'
+ | 'double4'
+ | 'vector' '<' scalar_type_specifier ',' ('1'|'2'|'3'|'4') '>'
+ ;
+
+matrix_type_specifier
+ : 'float1x1'
+ | 'float1x2'
+ | 'float1x3'
+ | 'float1x4'
+ | 'float2x1'
+ | 'float2x2'
+ | 'float2x3'
+ | 'float2x4'
+ | 'float3x1'
+ | 'float3x2'
+ | 'float3x3'
+ | 'float3x4'
+ | 'float4x1'
+ | 'float4x2'
+ | 'float4x3'
+ | 'float4x4'
+ | 'matrix' '<' scalar_type_specifier ',' ('1'|'2'|'3'|'4') ',' ('1'|'2'|'3'|'4') '>'
+ ;
+
+string_type_specifier
+ : 'string'
+ ;
+
+// Sampler declarations ----------------------------
+
+sampler_declaration
+ : SAMPLER ID '=' sampler_type_specifier '{' sampler_state_declaration+ '}' SEMI
+ | SAMPLER ID SEMI // GLSL format
+ | sampler_type_specifier id_declaration '=' '{' sampler_state_declaration_simple ']' SEMI // DX10 style
+ ;
+
+sampler_state_declaration
+ : ( ('Texture'|'texture') '=' '<' ID '>' SEMI ) // DX9 must have one of these
+ | sampler_state_declaration_simple
+ ;
+
+sampler_state_declaration_simple
+ : ( sampler_state_specifier '=' initializer SEMI ) // DX10 style
+ ;
+
+sampler_type_specifier
+ : 'sampler' | 'Sampler'
+ | 'sampler1D' | 'Sampler1D' | 'sampler1d'
+ | 'sampler2D' | 'Sampler2D' | 'sampler2d'
+ | 'sampler3D' | 'Sampler3D' | 'sampler3d'
+ | 'samplerCUBE' | 'SamplerCUBE' | 'samplercube'
+ | 'sampler_state' | 'samplerstate' | 'SamplerState'
+ | 'SamplerComparisonState' | 'samplercomparisonstate' // DX10 only
+ ;
+
+sampler_state_specifier
+ : 'AddressU' | 'addressu'
+ | 'AddressV' | 'addressv'
+ | 'AddressW' | 'addressw'
+ | 'BorderColor' | 'bordercolor'
+ | 'ComparisonFilter' | 'comparisonfilter' // SamplerComparisonState only
+ | 'ComparisonFunc' | 'comparisonfunc' // SamplerComparisonState only
+ | 'MagFilter' | 'magfilter'
+ | 'MaxAnisotropy' | 'maxanisotropy'
+ | 'MinFilter' | 'minfilter'
+ | 'MipFilter' | 'mipfilter'
+ | 'MipMapLODBias' | 'MipMapLodBias' | 'mipmapLODbias' | 'mipmaplodbias'
+ ;
+
+ // texture declaration ----------------------------
+
+texture_declaration
+ : texture_type_specifier ID annotation_list? SEMI
+ | texture_type_specifier '<'
+ (scalar_type_specifier | vector_type_specifier ) '>' ID SEMI // GLSL syntax.
+ ;
+
+texture_type_specifier
+ : 'texture'
+ | 'texture1D' | 'Texture1D'
+ | 'texture2D' | 'Texture2D'
+ | 'texture3D' | 'Texture3D'
+ | 'textureCUBE' | 'TextureCUBE'
+ ;
+
+ // struct declaration -----------------------------
+
+struct_type_specifier
+ : ID
+ | ( STRUCT ( ID )? LCURLY ) => struct_definition
+ | STRUCT ID
+ ;
+
+annotation_list
+ : '<' (annotation)* '>';
+
+annotation
+ : scalar_type_or_string_specifier ID '=' constant_expression SEMI ;
+
+initializer
+ : constant_expression
+ | '{' constant_expression ( ',' constant_expression )* '}'
+ ;
+
+register_name
+ // registers for VS_3_0
+ : 'register' '(' input_register_name | output_register_name ')';
+
+input_register_name
+ : (('v'|'r'|'c'|'b'|'i'|'s'|'o') DECIMAL_LITERAL)
+ | ('a0'|'aL'|'p0')
+ ;
+
+output_register_name
+ : 'oD0'|'oD1'|'oFog'|'oPos'|'oPts'
+ | 'oT0'|'oT1'|'oT2'|'oT3'|'oT4'|'oT5'|'oT6'|'oT7'
+ ;
+
+pack_offset
+ : .+ ; // no idea what this field looks like.
+
+argument_list
+ : ( param_declaration ( COMMA param_declaration )* )?
+ ;
+
+param_declaration
+ : param_direction? param_variability? param_type_specifier id_declaration semantic?
+ | SAMPLER ID
+// | FUNCTION type_specifier ID
+ ;
+
+param_variability
+ : CONST
+ | UNIFORM
+ ;
+
+param_direction
+ : IN
+ | OUT
+ | INOUT
+ ;
+
+function_body
+ : LCURLY ( decl_or_statement )* RCURLY
+ ;
+
+decl_or_statement
+ // We copied the following sub-rule here to expedite the parsing time
+ // as this is a much more common case than the "Id init_declarator_list"
+ // case which would normally spend a lot of time in exception handling.
+ : (lvalue_expression assignment_operator ) => assignment_statement
+ | ( ( CONST )? vector_type_specifier ) => ( CONST )? vector_type_specifier init_declarator_list SEMI
+ | ( ( CONST )? scalar_type_specifier ) => ( CONST )? scalar_type_specifier init_declarator_list SEMI
+ | ( STRUCT ( ID )? LCURLY ) => struct_definition ( init_declarator_list )? SEMI
+ | STRUCT ID init_declarator_list SEMI
+ | ( ID init_declarator_list ) => ID init_declarator_list SEMI
+ | statement
+ ;
+
+init_declarator_list
+ : init_declarator ( COMMA init_declarator )* ;
+
+init_declarator
+ : declarator ( ASSIGN initializer )? ;
+
+declarator
+ : ID ( LBRACKET ( constant_expression )? RBRACKET )*;
+
+struct_definition
+ : STRUCT ( ID )? LCURLY struct_declaration_list RCURLY ID? SEMI;
+
+struct_declaration_list
+ // We currently don't support nested structs so the field type
+ // can only be either a scalar or a vector.
+ : ( struct_interpolation_modifier?
+ (scalar_type_specifier|vector_type_specifier) ID
+ (COLON semantic_specifier)? SEMI )+
+ ;
+
+struct_interpolation_modifier // DX10 only
+ : 'linear'
+ | 'centroid'
+ | 'nointerpolation'
+ | 'noperspective'
+ ;
+
+semantic_specifier
+ : ID ;
+
+statement
+ : ( lvalue_expression assignment_operator ) => assignment_statement
+ | ( lvalue_expression self_modify_operator ) => post_modify_statement
+ | pre_modify_statement
+ | expression_statement
+ | compound_statement
+ | selection_statement
+ | iteration_statement
+ | jump_statement
+ | SEMI
+ ;
+
+assignment_statement
+ : lvalue_expression assignment_operator expression SEMI ;
+
+pre_modify_statement
+ : pre_modify_expression SEMI ;
+
+pre_modify_expression
+ : self_modify_operator lvalue_expression ;
+
+post_modify_statement
+ : post_modify_expression SEMI ;
+
+post_modify_expression
+ : lvalue_expression self_modify_operator ;
+
+self_modify_operator
+ : PLUSPLUS | MINUSMINUS ;
+
+expression_statement
+ : expression SEMI ;
+
+compound_statement
+ : LCURLY (
+ ( ID init_declarator_list) => ID init_declarator_list SEMI
+ | ( ( CONST )? vector_type_specifier ) => ( CONST )? vector_type_specifier init_declarator_list SEMI
+ | ( ( CONST )? scalar_type_specifier ) => ( CONST )? scalar_type_specifier init_declarator_list SEMI
+ | ( STRUCT ( ID )? LCURLY ) => struct_definition ( init_declarator_list )? SEMI
+ | STRUCT ID init_declarator_list SEMI
+ | statement
+ )*
+ RCURLY
+ ;
+
+selection_statement
+ : IF LPAREN expression RPAREN statement ( ELSE statement )?
+ ;
+
+iteration_statement
+ : WHILE LPAREN expression RPAREN statement
+ | FOR LPAREN assignment_statement
+ equality_expression SEMI modify_expression RPAREN statement
+ | DO statement WHILE LPAREN expression RPAREN SEMI
+ ;
+
+modify_expression
+ : (lvalue_expression assignment_operator ) =>
+ lvalue_expression assignment_operator expression
+ | pre_modify_expression
+ | post_modify_expression
+ ;
+
+jump_statement
+ : BREAK SEMI
+ | CONTINUE
+ | RETURN ( expression )? SEMI
+ | DISCARD
+ ;
+
+expression
+ : conditional_expression ;
+
+assignment_operator
+ : ASSIGN
+ | MUL_ASSIGN
+ | DIV_ASSIGN
+ | ADD_ASSIGN
+ | SUB_ASSIGN
+ | BITWISE_AND_ASSIGN
+ | BITWISE_OR_ASSIGN
+ | BITWISE_XOR_ASSIGN
+ | BITWISE_SHIFTL_ASSIGN
+ | BITWISE_SHIFTR_ASSIGN
+ ;
+
+constant_expression
+ : (ID) => variable_expression
+ | literal_value ;
+
+conditional_expression
+ : logical_or_expression ( QUESTION expression COLON conditional_expression )?
+ ;
+
+logical_or_expression
+ : exclusive_or_expression ( OR exclusive_or_expression )*
+ ;
+
+// We remove the NOT operator from the unary expression and stick it here
+// so that it has a lower precedence than relational operations.
+logical_and_expression
+ : ( NOT )? inclusive_or_expression ( AND ( NOT )? inclusive_or_expression )*
+ ;
+
+inclusive_or_expression
+ : exclusive_or_expression (BITWISE_OR exclusive_or_expression )*
+ ;
+
+exclusive_or_expression
+ : and_expression ( BITWISE_XOR and_expression )*
+ ;
+
+and_expression
+ : equality_expression ( BITWISE_AND equality_expression )*
+ ;
+
+equality_expression
+ : relational_expression ( (EQUAL|NOT_EQUAL) relational_expression )*
+ ;
+
+relational_expression
+ : shift_expression ( (LT|GT|LTE|GTE) shift_expression )*
+ ;
+
+shift_expression
+ : additive_expression ( (BITWISE_SHIFTL|BITWISE_SHIFTR) additive_expression )*
+ ;
+
+additive_expression
+ : multiplicative_expression ( (PLUS|MINUS) multiplicative_expression )*
+ ;
+
+multiplicative_expression
+ : cast_expression ( (MUL|DIV|MOD) cast_expression )*
+ ;
+
+cast_expression
+ : LBRACKET param_type_specifier RBRACKET cast_expression
+ | unary_expression
+ ;
+
+unary_expression
+ : (PLUS|MINUS) unary_expression
+ | postfix_expression
+ ;
+
+postfix_expression
+ : primary_expression ( postfix_suffix )? ;
+
+lvalue_expression
+ : variable_expression ( postfix_suffix )? ;
+
+postfix_suffix
+ // choosing between struct field access or vector swizzling is a semantic choice.
+ : ( DOT swizzle )
+ | ( DOT primary_expression )+ ;
+
+primary_expression
+// : constructor
+ : intrinsic_name LPAREN argument_expression_list RPAREN
+ | variable_or_call_expression
+ | literal_value
+ | LPAREN expression RPAREN
+ ;
+
+variable_expression
+ : ID ( LBRACKET expression RBRACKET )? ;
+
+// Combine variable expression and call expression here to get rid of the
+// syntactic predicate we used to use in the primary_expression rule. Using
+// predicates results in the parser spending a lot of time in exception
+// handling (when lookahead fails).
+variable_or_call_expression
+ : ID
+ (
+ ( ( LBRACKET expression RBRACKET )? )
+ |
+ ( LPAREN argument_expression_list RPAREN )
+ )
+ ;
+
+constructor
+ : vector_type_specifier LPAREN expression ( COMMA expression )* RPAREN ;
+
+argument_expression_list
+ : ( expression ( COMMA expression )* )? ;
+
+intrinsic_name
+ : ABS
+ | ACOS
+ | ALL
+ | ANY
+ | ASFLOAT
+ | ASIN
+ | ASINT
+ | ASUINT
+ | ATAN
+ | ATAN2
+ | CEIL
+ | CLAMP
+ | CLIP
+ | COS
+ | COSH
+ | CROSS
+ | DDX
+ | DDY
+ | DEGREES
+ | DETERMINANT
+ | DISTANCE
+ | DOT
+ | EXP
+ | EXP2
+ | FACEFORWARD
+ | FLOOR
+ | FMOD
+ | FRAC
+ | FREXP
+ | FWIDTH
+ | ISFINITE
+ | ISINF
+ | ISNAN
+ | LDEXP
+ | LENGTH
+ | LERP
+ | LIT
+ | LOG
+ | LOG10
+ | LOG2
+ | MAX
+ | MIN
+ | MODF
+ | MUL
+ | NOISE
+ | NORMALIZE
+ | POW
+ | RADIANS
+ | REFLECT
+ | REFRACT
+ | ROUND
+ | RSQRT
+ | SATURATE
+ | SIGN
+ | SIN
+ | SINCOS
+ | SINH
+ | SMOOTHSTEP
+ | SQRT
+ | STEP
+ | TAN
+ | TANH
+ | TEX1D
+ | TEX1DBIAS
+ | TEX1DGRAD
+ | TEX1DLOD
+ | TEX1DPROJ
+ | TEX2D
+ | TEX2DBIAS
+ | TEX2DGRAD
+ | TEX2DLOD
+ | TEX2DPROJ
+ | TEX3D
+ | TEX3DBIAS
+ | TEX3DGRAD
+ | TEX3DLOD
+ | TEX3DPROJ
+ | TEXCUBE
+ | TEXCUBEBIAS
+ | TEXCUBEGRAD
+ | TEXCUBELOD
+ | TEXCUBEPROJ
+ | TRANSPOSE
+ | TRUNC
+ ;
+
+int_literal
+ : DECIMAL_LITERAL
+ | OCT_LITERAL
+ | HEX_LITERAL
+ ;
+literal_value
+ : ('"') => string_literal
+ | int_literal
+ | float_literal
+ ;
+
+
+float_literal
+ : FLOAT_LITERAL
+ ;
+
+string_literal
+ : '"' STRING_LITERAL '"'
+ ;
+
+vector_subcomponent
+ : DOT ('x'|'y'|'z'|'w'|'r'|'g'|'b'|'a')
+ ;
+
+swizzle
+ : ( s += ('x'|'y'|'z'|'w') )+ { $s.size() <= 4 }?
+ | ( s += ('r'|'g'|'b'|'a') )+ { $s.size() <= 4 }?
+ ;
+
+// effects ---------------------------------------
+
+technique
+ : 'technique' ID? '{' (pass)+ '}' SEMI?
+ ;
+
+pass
+ : 'pass' (ID)? '{' (state_assignment)* '}' SEMI?
+ ;
+
+state_assignment
+ : a=ID '=' state_assignment_value SEMI
+ { System.out.println("Found stateassignment: " + $a.text); }
+ ;
+
+state_assignment_value
+ : 'compile' p=ID q=variable_or_call_expression
+ { System.out.println("Found compile: " + $p.text + " " + $q.text); }
+ | a=expression
+ { System.out.println("Found stateassignmentvalue: " + $a.text); }
+ | ('true' | 'false')
+ ;
+
+// -----------------------------------------------------------------------------
+
+NOT : '!' ;
+NOT_EQUAL : '!=' ;
+AND : '&&' ;
+LPAREN : '(' ;
+RPAREN : ')' ;
+MUL : '*' ;
+MUL_ASSIGN : '*=' ;
+PLUS : '+' ;
+PLUSPLUS : '++' ;
+ADD_ASSIGN : '+=' ;
+COMMA : ',' ;
+MINUS : '-' ;
+MINUSMINUS : '--' ;
+SUB_ASSIGN : '-=' ;
+DIV : '/' ;
+DIV_ASSIGN : '/=' ;
+MOD : '%';
+MOD_ASSIGN : '%=';
+COLON : ':' ;
+SEMI : ';' ;
+LT : '<' ;
+LTE : '<=' ;
+ASSIGN : '=' ;
+EQUAL : '==' ;
+GT : '>' ;
+GTE : '>=' ;
+QUESTION : '?' ;
+LBRACKET : '[' ;
+RBRACKET : ']' ;
+LCURLY : '{' ;
+OR : '||' ;
+RCURLY : '}' ;
+DOT : '.' ;
+BITWISE_NOT : '~';
+BITWISE_SHIFTL : '<<';
+BITWISE_SHIFTR : '>>';
+BITWISE_AND : '&';
+BITWISE_OR : '|';
+BITWISE_XOR : '^';
+BITWISE_SHIFTL_ASSIGN : '<<=';
+BITWISE_SHIFTR_ASSIGN : '>>=';
+BITWISE_AND_ASSIGN : '&=';
+BITWISE_OR_ASSIGN : '|=';
+BITWISE_XOR_ASSIGN : '^=';
+
+// keywords ----------------------------
+
+BREAK : 'break';
+BUFFER : 'buffer';
+CBUFFER : 'cbuffer';
+CONST : 'const';
+CONTINUE : 'continue';
+DISCARD : 'discard';
+DO : 'do';
+ELSE : 'else';
+EXTERN : 'extern';
+FALSE : 'false';
+FOR : 'for';
+IF : 'if';
+IN : 'in';
+INLINE : 'inline';
+INOUT : 'inout';
+MATRIX : 'matrix';
+NAMESPACE : 'namespace';
+NOINTERPOLATION : 'nointerpolation';
+OUT : 'out';
+RETURN : 'return';
+REGISTER : 'register';
+SHARED : 'shared';
+STATEBLOCK : 'stateblock';
+STATEBLOCK_STATE : 'stateblock_state';
+STATIC : 'static';
+STRING : 'string';
+STRUCT : 'struct';
+SWITCH : 'switch';
+TBUFFER : 'tbuffer';
+TEXTURE : 'texture';
+TEXTURE1D : 'texture1d';
+TEXTURE1DARRAY : 'texture1darray';
+TEXTURE2D : 'texture2d';
+TEXTURE2DARRAY : 'texture2darray';
+TEXTURE2DMS : 'texture2dms';
+TEXTURE2DMSARRAY : 'texture2dmsarray';
+TEXTURE3D : 'texture3d';
+TEXTURECUBE : 'texturecube';
+TEXTURECUBEARRAY : 'texturecubearray';
+TRUE : 'true';
+TYPEDEF : 'typedef';
+UNIFORM : 'uniform';
+VOID : 'void';
+VOLATILE : 'volatile';
+WHILE : 'while';
+
+// fx keywords ---------------------
+
+BLENDSTATE : 'blendstate';
+COMPILE : 'compile';
+DEPTHSTENCILSTATE : 'depthstencilstate';
+DEPTHSTENCILVIEW : 'depthstencilview';
+GEOMETRYSHADER : 'geometryshader';
+PASS : 'pass';
+PIXELSHADER : 'pixelshader';
+RASTERIZERSTATE : 'rasterizerstate';
+RENDERTARGETVIEW : 'rendertargetview';
+TECHNIQUE : 'technique';
+TECHNIQUE10 : 'technique10';
+VERTEXSHADER : 'vertexshader';
+
+
+// intrinsic functions --------------------
+ABS : 'abs';
+ACOS : 'acos';
+ALL : 'all';
+ANY : 'any';
+ASFLOAT : 'asfloat';
+ASIN : 'asin';
+ASINT : 'asint';
+ASUINT : 'asuint';
+ATAN : 'atan';
+ATAN2 : 'atan2';
+CEIL : 'ceil';
+CLAMP : 'clamp';
+CLIP : 'clip';
+COS : 'cos';
+COSH : 'cosh';
+CROSS : 'cross';
+DDX : 'ddx';
+DDY : 'ddy';
+DEGREES : 'degrees';
+DETERMINANT : 'determinant';
+DISTANCE : 'distance';
+DOT_PRODUCT : 'dot';
+EXP : 'exp';
+EXP2 : 'exp2';
+FACEFORWARD : 'faceforward';
+FLOOR : 'floor';
+FMOD : 'fmod';
+FRAC : 'frac';
+FREXP : 'frexp';
+FWIDTH : 'fwidth';
+ISFINITE : 'isfinite';
+ISINF : 'isinf';
+ISNAN : 'isnan';
+LDEXP : 'ldexp';
+LENGTH : 'length';
+LERP : 'lerp';
+LIT : 'lit';
+LOG : 'log';
+LOG10 : 'log10';
+LOG2 : 'log2';
+MAX : 'max';
+MIN : 'min';
+MODF : 'modf';
+MUL_FUNC : 'mul';
+NOISE : 'noise';
+NORMALIZE : 'normalize';
+POW : 'pow';
+RADIANS : 'radians';
+REFLECT : 'reflect';
+REFRACT : 'refract';
+ROUND : 'round';
+RSQRT : 'rsqrt';
+SATURATE : 'saturate';
+SIGN : 'sign';
+SIN : 'sin';
+SINCOS : 'sincos';
+SINH : 'sinh';
+SMOOTHSTEP : 'smoothstep';
+SQRT : 'sqrt';
+STEP : 'step';
+TAN : 'tan';
+TANH : 'tanh';
+TEX1D : 'tex1D';
+TEX1DBIAS : 'tex1Dbias';
+TEX1DGRAD : 'tex1Dgrad';
+TEX1DLOD : 'tex1Dlod';
+TEX1DPROJ : 'tex1Dproj';
+TEX2D : 'tex2D';
+TEX2DBIAS : 'tex2Dbias';
+TEX2DGRAD : 'tex2Dgrad';
+TEX2DLOD : 'tex2Dlod';
+TEX2DPROJ : 'tex2Dproj';
+TEX3D : 'tex3D';
+TEX3DBIAS : 'tex3Dbias';
+TEX3DGRAD : 'tex3Dgrad';
+TEX3DLOD : 'tex3Dlod';
+TEX3DPROJ : 'tex3Dproj';
+TEXCUBE : 'texCUBE';
+TEXCUBEBIAS : 'texCUBEbias';
+TEXCUBEGRAD : 'texCUBEgrad';
+TEXCUBELOD : 'texCUBElod';
+TEXCUBEPROJ : 'texCUBEproj';
+TRANSPOSE : 'transpose';
+TRUNC : 'trunc';
+
+
+
+// fundamental tokens ---------------------
+
+fragment HEXDIGIT
+ : ('0'..'9'|'a'..'f'|'A'..'F')
+ ;
+
+fragment UNICODE_ESCAPE
+ : '\\' 'u' HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT
+ ;
+
+fragment OCTAL_ESCAPE
+ : '\\' ('0'..'3') ('0'..'7') ('0'..'7')
+ | '\\' ('0'..'7') ('0'..'7')
+ | '\\' ('0'..'7')
+ ;
+
+fragment ESCAPE_SEQUENCE
+ : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
+ | UNICODE_ESCAPE
+ | OCTAL_ESCAPE
+ ;
+
+fragment EXPONENT : ('e'|'E') (PLUS | MINUS)? ('0'..'9')+ ;
+
+fragment FLOATSUFFIX : ('f'|'F'|'h'|'H') ;
+
+ID
+ : ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
+ {
+ // check the length of the identifier before accepting it.
+ if (($ID.length() > 96)) {
+ RecognitionException();
+ }
+ }
+ ;
+
+DECIMAL_LITERAL
+ : ('1'..'9')('0'..'9')+
+ ;
+
+OCT_LITERAL
+ : ('0'..'3') ('0'..'7') ('0'..'7')
+ | ('0'..'7') ('0'..'7')
+ | ('0'..'7')
+ ;
+
+HEX_LITERAL
+ : '0x' HEXDIGIT+
+ ;
+
+CHARACTER_LITERAL
+ : '\'' ( ESCAPE_SEQUENCE | ~('\''|'\\') ) '\''
+ ;
+
+STRING_LITERAL
+ : ( ESCAPE_SEQUENCE | ~('\\'|'"') )*
+ ;
+
+FLOAT_LITERAL
+ : (PLUS | MINUS)? ('0'..'9')+ '.' ('0'..'9')* (EXPONENT)? (FLOATSUFFIX)?
+ | (PLUS | MINUS)? '.' ('0'..'9')+ (EXPONENT)? (FLOATSUFFIX)?
+ | (PLUS | MINUS)? ('0'..'9')+ (EXPONENT)? (FLOATSUFFIX)?
+ ;
+
+// skipped elements -----------------
+
+WHITESPACE
+ : ( ' ' | '\t' | '\f' | '\r' )
+ { $channel = HIDDEN; }
+ ;
+
+COMMENT
+ : '//' (~('\n'|'\r'))*
+ { $channel = HIDDEN; }
+ ;
+
+MULTILINE_COMMENT
+ : '/*' ( options {greedy=false;} : . )* '*/'
+ { $channel = HIDDEN; }
+ ;
+
+//RESERVED_WORDS
+// : 'auto'
+// | 'case'
+// | 'catch'
+// | 'char'
+// | 'class'
+// | 'const_cast'
+// | 'default'
+// | 'delete'
+// | 'dynamic_cast'
+// | 'enum'
+// | 'explicit'
+// | 'friend'
+// | 'goto'
+// | 'long'
+// | 'mutable'
+// | 'new'
+// | 'operator'
+// | 'private'
+// | 'protected'
+// | 'public'
+// | 'reinterpret_cast'
+// | 'short'
+// | 'signed'
+// | 'sizeof'
+// | 'snorm'
+// | 'static_cast'
+// | 'template'
+// | 'this'
+// | 'throw'
+// | 'try'
+// | 'typename'
+// | 'union'
+// | 'unorm'
+// | 'unsigned'
+// | 'using'
+// | 'varying'
+// | 'virtual'
+// { $channel = HIDDEN; }
+// ;