| /* |
| * 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 '_'; |
| |