blob: d4a321034d1693b8e16725b5ba266415c71c86ef [file] [log] [blame]
/*
* Mesa 3-D graphics library
* Version: 6.6
*
* Copyright (C) 2006 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/**
* \file slang_pp_directives.syn
* slang preprocessor directives parser
* \author Michal Krol
*/
.syntax source;
/*
* This syntax script preprocesses a GLSL shader.
* It is assumed, that the #version directive has been parsed. Separate pass for parsing
* version gives better control on behavior depending on the version number given.
*
* The output is a source string with comments and directives removed. White spaces and comments
* are replaced with on or more spaces. All new-lines are preserved and converted to Linux format.
* Directives are escaped with a null character. The end of the source string is marked by
* two consecutive null characters. The consumer is responsible for executing the escaped
* directives, removing dead portions of code and expanding macros.
*/
.emtcode ESCAPE_TOKEN 0
/*
* The TOKEN_* symbols follow the ESCAPE_TOKEN.
*
* NOTE:
* There is no TOKEN_IFDEF and neither is TOKEN_IFNDEF. They are handled with TOKEN_IF and
* operator defined.
* The "#ifdef SYMBOL" is replaced with "#if defined SYMBOL"
* The "#ifndef SYMBOL" is replaced with "#if !defined SYMBOL"
*/
.emtcode TOKEN_END 0
.emtcode TOKEN_DEFINE 1
.emtcode TOKEN_UNDEF 2
.emtcode TOKEN_IF 3
.emtcode TOKEN_ELSE 4
.emtcode TOKEN_ELIF 5
.emtcode TOKEN_ENDIF 6
.emtcode TOKEN_ERROR 7
.emtcode TOKEN_PRAGMA 8
.emtcode TOKEN_EXTENSION 9
.emtcode TOKEN_LINE 10
/*
* The PARAM_* symbols follow the TOKEN_DEFINE.
*/
.emtcode PARAM_END 0
.emtcode PARAM_PARAMETER 1
/*
* The BEHAVIOR_* symbols follow the TOKEN_EXTENSION.
*/
.emtcode BEHAVIOR_REQUIRE 1
.emtcode BEHAVIOR_ENABLE 2
.emtcode BEHAVIOR_WARN 3
.emtcode BEHAVIOR_DISABLE 4
source
optional_directive .and .loop source_element .and '\0' .emit ESCAPE_TOKEN .emit TOKEN_END;
source_element
c_style_comment_block .or cpp_style_comment_block .or new_line_directive .or source_token;
c_style_comment_block
'/' .and '*' .and c_style_comment_rest .and .true .emit ' ';
c_style_comment_rest
.loop c_style_comment_body .and c_style_comment_end;
c_style_comment_body
c_style_comment_char_nostar .or c_style_comment_char_star_noslashstar;
c_style_comment_char_nostar
new_line .or '\x2B'-'\xFF' .or '\x01'-'\x29';
c_style_comment_char_star_noslashstar
'*' .and c_style_comment_char_star_noslashstar_1;
c_style_comment_char_star_noslashstar_1
c_style_comment_char_noslashstar .or c_style_comment_char_star_noslashstar;
c_style_comment_char_noslashstar
new_line .or '\x30'-'\xFF' .or '\x01'-'\x29' .or '\x2B'-'\x2E';
c_style_comment_end
'*' .and .loop c_style_comment_char_star .and '/';
c_style_comment_char_star
'*';
cpp_style_comment_block
'/' .and '/' .and cpp_style_comment_block_1;
cpp_style_comment_block_1
cpp_style_comment_block_2 .or cpp_style_comment_block_3;
cpp_style_comment_block_2
.loop cpp_style_comment_char .and new_line_directive;
cpp_style_comment_block_3
.loop cpp_style_comment_char;
cpp_style_comment_char
'\x0E'-'\xFF' .or '\x01'-'\x09' .or '\x0B'-'\x0C';
new_line_directive
new_line .and optional_directive;
new_line
generic_new_line .emit '\n';
generic_new_line
carriage_return_line_feed .or line_feed_carriage_return .or '\n' .or '\r';
carriage_return_line_feed
'\r' .and '\n';
line_feed_carriage_return
'\n' .and '\r';
optional_directive
directive .emit ESCAPE_TOKEN .or .true;
directive
dir_define .emit TOKEN_DEFINE .or
dir_undef .emit TOKEN_UNDEF .or
dir_if .emit TOKEN_IF .or
dir_ifdef .emit TOKEN_IF .emit 'd' .emit 'e' .emit 'f' .emit 'i' .emit 'n' .emit 'e' .emit 'd'
.emit ' ' .or
dir_ifndef .emit TOKEN_IF .emit '!' .emit 'd' .emit 'e' .emit 'f' .emit 'i' .emit 'n' .emit 'e'
.emit 'd' .emit ' ' .or
dir_else .emit TOKEN_ELSE .or
dir_elif .emit TOKEN_ELIF .or
dir_endif .emit TOKEN_ENDIF .or
dir_ext .emit TOKEN_EXTENSION .or
dir_line .emit TOKEN_LINE;
dir_define
optional_space .and '#' .and optional_space .and "define" .and symbol .and opt_parameters .and
definition;
dir_undef
optional_space .and '#' .and optional_space .and "undef" .and symbol;
dir_if
optional_space .and '#' .and optional_space .and "if" .and expression;
dir_ifdef
optional_space .and '#' .and optional_space .and "ifdef" .and symbol;
dir_ifndef
optional_space .and '#' .and optional_space .and "ifndef" .and symbol;
dir_else
optional_space .and '#' .and optional_space .and "else";
dir_elif
optional_space .and '#' .and optional_space .and "elif" .and expression;
dir_endif
optional_space .and '#' .and optional_space .and "endif";
dir_ext
optional_space .and '#' .and optional_space .and "extension" .and space .and extension_name .and
optional_space .and ':' .and optional_space .and extension_behavior;
dir_line
optional_space .and '#' .and optional_space .and "line" .and expression;
symbol
space .and symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\0';
opt_parameters
parameters .or .true .emit PARAM_END;
parameters
'(' .and parameters_1 .and optional_space .and ')' .emit PARAM_END;
parameters_1
parameters_2 .or .true;
parameters_2
parameter .emit PARAM_PARAMETER .and .loop parameters_3;
parameters_3
optional_space .and ',' .and parameter .emit PARAM_PARAMETER;
parameter
optional_space .and symbol_character .emit * .and .loop symbol_character2 .emit * .and
.true .emit '\0';
definition
.loop definition_character .emit * .and .true .emit '\0';
definition_character
'\x0E'-'\xFF' .or '\x01'-'\x09' .or '\x0B'-'\x0C';
expression
expression_element .and .loop expression_element .and .true .emit '\0';
expression_element
expression_character .emit *;
expression_character
'\x0E'-'\xFF' .or '\x01'-'\x09' .or '\x0B'-'\x0C';
extension_name
symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\0';
extension_behavior
"require" .emit BEHAVIOR_REQUIRE .or
"enable" .emit BEHAVIOR_ENABLE .or
"warn" .emit BEHAVIOR_WARN .or
"disable" .emit BEHAVIOR_DISABLE;
optional_space
.loop single_space;
space
single_space .and .loop single_space;
single_space
' ' .or '\t';
source_token
space .emit ' ' .or complex_token .or source_token_1;
source_token_1
simple_token .emit ' ' .and .true .emit ' ';
/*
* All possible tokens.
*/
complex_token
identifier .or number;
simple_token
increment .or decrement .or lequal .or gequal .or equal .or nequal .or and .or xor .or or .or
addto .or subtractfrom .or multiplyto .or divideto .or other;
identifier
identifier_char1 .emit * .and .loop identifier_char2 .emit *;
identifier_char1
'a'-'z' .or 'A'-'Z' .or '_';
identifier_char2
'a'-'z' .or 'A'-'Z' .or '0'-'9' .or '_';
number
float .or integer;
digit_oct
'0'-'7';
digit_dec
'0'-'9';
digit_hex
'0'-'9' .or 'A'-'F' .or 'a'-'f';
float
float_1 .or float_2;
float_1
float_fractional_constant .and float_optional_exponent_part;
float_2
float_digit_sequence .and float_exponent_part;
float_fractional_constant
float_fractional_constant_1 .or float_fractional_constant_2 .or float_fractional_constant_3;
float_fractional_constant_1
float_digit_sequence .and '.' .emit '.' .and float_digit_sequence;
float_fractional_constant_2
float_digit_sequence .and '.' .emit '.';
float_fractional_constant_3
'.' .emit '.' .and float_digit_sequence;
float_optional_exponent_part
float_exponent_part .or .true;
float_digit_sequence
digit_dec .emit * .and .loop digit_dec .emit *;
float_exponent_part
float_exponent_part_1 .or float_exponent_part_2;
float_exponent_part_1
'e' .emit 'e' .and float_optional_sign .and float_digit_sequence;
float_exponent_part_2
'E' .emit 'E' .and float_optional_sign .and float_digit_sequence;
float_optional_sign
'+' .emit '+' .or '-' .emit '-' .or .true;
integer
integer_hex .or integer_oct .or integer_dec;
integer_hex
'0' .emit '0' .and integer_hex_1 .emit * .and digit_hex .emit * .and
.loop digit_hex .emit *;
integer_hex_1
'x' .or 'X';
integer_oct
'0' .emit '0' .and .loop digit_oct .emit *;
integer_dec
digit_dec .emit * .and .loop digit_dec .emit *;
increment
'+' .emit * .and '+' .emit *;
decrement
'-' .emit * .and '-' .emit *;
lequal
'<' .emit * .and '=' .emit *;
gequal
'>' .emit * .and '=' .emit *;
equal
'=' .emit * .and '=' .emit *;
nequal
'!' .emit * .and '=' .emit *;
and
'&' .emit * .and '&' .emit *;
xor
'^' .emit * .and '^' .emit *;
or
'|' .emit * .and '|' .emit *;
addto
'+' .emit * .and '=' .emit *;
subtractfrom
'-' .emit * .and '=' .emit *;
multiplyto
'*' .emit * .and '=' .emit *;
divideto
'/' .emit * .and '=' .emit *;
/*
* All characters except '\0' and '#'.
*/
other
'\x24'-'\xFF' .emit * .or '\x01'-'\x22' .emit *;
symbol_character
'A'-'Z' .or 'a'-'z' .or '_';
symbol_character2
'A'-'Z' .or 'a'-'z' .or '0'-'9' .or '_';
.string string_lexer;
string_lexer
lex_first_identifier_character .and .loop lex_next_identifier_character;
lex_first_identifier_character
'a'-'z' .or 'A'-'Z' .or '_';
lex_next_identifier_character
'a'-'z' .or 'A'-'Z' .or '0'-'9' .or '_';