Fix Windows newlines.

This commit is contained in:
Michal Krol
2006-09-26 12:10:33 +00:00
parent 16647b739b
commit 4303d22739
4 changed files with 1060 additions and 1213 deletions
@@ -1,385 +1,385 @@
/*
* 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 '_';
/*
* 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 '_';
@@ -1,337 +1,239 @@
/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED FROM THE .syn FILE */
"
\n"
"
\n"
"
\n"
"
\n"
".syntax source;
\n"
"
\n"
"
\n"
"
\n"
".emtcode ESCAPE_TOKEN 0
\n"
"
\n"
"
\n"
".emtcode TOKEN_END 0
\n"
".emtcode TOKEN_DEFINE 1
\n"
".emtcode TOKEN_UNDEF 2
\n"
".emtcode TOKEN_IF 3
\n"
".emtcode TOKEN_ELSE 4
\n"
".emtcode TOKEN_ELIF 5
\n"
".emtcode TOKEN_ENDIF 6
\n"
".emtcode TOKEN_ERROR 7
\n"
".emtcode TOKEN_PRAGMA 8
\n"
".emtcode TOKEN_EXTENSION 9
\n"
".emtcode TOKEN_LINE 10
\n"
"
\n"
"
\n"
".emtcode PARAM_END 0
\n"
".emtcode PARAM_PARAMETER 1
\n"
"
\n"
"
\n"
".emtcode BEHAVIOR_REQUIRE 1
\n"
".emtcode BEHAVIOR_ENABLE 2
\n"
".emtcode BEHAVIOR_WARN 3
\n"
".emtcode BEHAVIOR_DISABLE 4
\n"
"
\n"
"source
\n"
" optional_directive .and .loop source_element .and '\\0' .emit ESCAPE_TOKEN .emit TOKEN_END;
\n"
"
\n"
"source_element
\n"
" c_style_comment_block .or cpp_style_comment_block .or new_line_directive .or source_token;
\n"
"
\n"
"c_style_comment_block
\n"
" '/' .and '*' .and c_style_comment_rest .and .true .emit ' ';
\n"
"
\n"
"c_style_comment_rest
\n"
" .loop c_style_comment_body .and c_style_comment_end;
\n"
"
\n"
"c_style_comment_body
\n"
" c_style_comment_char_nostar .or c_style_comment_char_star_noslashstar;
\n"
"
\n"
"c_style_comment_char_nostar
\n"
" new_line .or '\\x2B'-'\\xFF' .or '\\x01'-'\\x29';
\n"
"
\n"
"c_style_comment_char_star_noslashstar
\n"
" '*' .and c_style_comment_char_star_noslashstar_1;
\n"
"c_style_comment_char_star_noslashstar_1
\n"
" c_style_comment_char_noslashstar .or c_style_comment_char_star_noslashstar;
\n"
"
\n"
"c_style_comment_char_noslashstar
\n"
" new_line .or '\\x30'-'\\xFF' .or '\\x01'-'\\x29' .or '\\x2B'-'\\x2E';
\n"
"
\n"
"c_style_comment_end
\n"
" '*' .and .loop c_style_comment_char_star .and '/';
\n"
"
\n"
"c_style_comment_char_star
\n"
" '*';
\n"
"
\n"
"cpp_style_comment_block
\n"
" '/' .and '/' .and cpp_style_comment_block_1;
\n"
"cpp_style_comment_block_1
\n"
" cpp_style_comment_block_2 .or cpp_style_comment_block_3;
\n"
"cpp_style_comment_block_2
\n"
" .loop cpp_style_comment_char .and new_line_directive;
\n"
"cpp_style_comment_block_3
\n"
" .loop cpp_style_comment_char;
\n"
"
\n"
"cpp_style_comment_char
\n"
" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';
\n"
"
\n"
"new_line_directive
\n"
" new_line .and optional_directive;
\n"
"
\n"
"new_line
\n"
" generic_new_line .emit '\\n';
\n"
"
\n"
"generic_new_line
\n"
" carriage_return_line_feed .or line_feed_carriage_return .or '\\n' .or '\\r';
\n"
"
\n"
"carriage_return_line_feed
\n"
" '\\r' .and '\\n';
\n"
"
\n"
"line_feed_carriage_return
\n"
" '\\n' .and '\\r';
\n"
"
\n"
"optional_directive
\n"
" directive .emit ESCAPE_TOKEN .or .true;
\n"
"
\n"
"directive
\n"
" dir_define .emit TOKEN_DEFINE .or
\n"
" dir_undef .emit TOKEN_UNDEF .or
\n"
" dir_if .emit TOKEN_IF .or
\n"
" dir_ifdef .emit TOKEN_IF .emit 'd' .emit 'e' .emit 'f' .emit 'i' .emit 'n' .emit 'e' .emit 'd'
\n"
" .emit ' ' .or
\n"
" dir_ifndef .emit TOKEN_IF .emit '!' .emit 'd' .emit 'e' .emit 'f' .emit 'i' .emit 'n' .emit 'e'
\n"
" .emit 'd' .emit ' ' .or
\n"
" dir_else .emit TOKEN_ELSE .or
\n"
" dir_elif .emit TOKEN_ELIF .or
\n"
" dir_endif .emit TOKEN_ENDIF .or
\n"
" dir_ext .emit TOKEN_EXTENSION .or
\n"
" dir_line .emit TOKEN_LINE;
\n"
"
\n"
"dir_define
\n"
" optional_space .and '#' .and optional_space .and \"define\" .and symbol .and opt_parameters .and
\n"
" definition;
\n"
"
\n"
"dir_undef
\n"
" optional_space .and '#' .and optional_space .and \"undef\" .and symbol;
\n"
"
\n"
"dir_if
\n"
" optional_space .and '#' .and optional_space .and \"if\" .and expression;
\n"
"
\n"
"dir_ifdef
\n"
" optional_space .and '#' .and optional_space .and \"ifdef\" .and symbol;
\n"
"
\n"
"dir_ifndef
\n"
" optional_space .and '#' .and optional_space .and \"ifndef\" .and symbol;
\n"
"
\n"
"dir_else
\n"
" optional_space .and '#' .and optional_space .and \"else\";
\n"
"
\n"
"dir_elif
\n"
" optional_space .and '#' .and optional_space .and \"elif\" .and expression;
\n"
"
\n"
"dir_endif
\n"
" optional_space .and '#' .and optional_space .and \"endif\";
\n"
"
\n"
"dir_ext
\n"
" optional_space .and '#' .and optional_space .and \"extension\" .and space .and extension_name .and
\n"
" optional_space .and ':' .and optional_space .and extension_behavior;
\n"
"
\n"
"dir_line
\n"
" optional_space .and '#' .and optional_space .and \"line\" .and expression;
\n"
"
\n"
"symbol
\n"
" space .and symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\\0';
\n"
"
\n"
"opt_parameters
\n"
" parameters .or .true .emit PARAM_END;
\n"
"
\n"
"parameters
\n"
" '(' .and parameters_1 .and optional_space .and ')' .emit PARAM_END;
\n"
"parameters_1
\n"
" parameters_2 .or .true;
\n"
"parameters_2
\n"
" parameter .emit PARAM_PARAMETER .and .loop parameters_3;
\n"
"parameters_3
\n"
" optional_space .and ',' .and parameter .emit PARAM_PARAMETER;
\n"
"
\n"
"parameter
\n"
" optional_space .and symbol_character .emit * .and .loop symbol_character2 .emit * .and
\n"
" .true .emit '\\0';
\n"
"
\n"
"definition
\n"
" .loop definition_character .emit * .and .true .emit '\\0';
\n"
"
\n"
"definition_character
\n"
" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';
\n"
"
\n"
"expression
".syntax source;\n"
".emtcode ESCAPE_TOKEN 0\n"
".emtcode TOKEN_END 0\n"
".emtcode TOKEN_DEFINE 1\n"
".emtcode TOKEN_UNDEF 2\n"
".emtcode TOKEN_IF 3\n"
".emtcode TOKEN_ELSE 4\n"
".emtcode TOKEN_ELIF 5\n"
".emtcode TOKEN_ENDIF 6\n"
".emtcode TOKEN_ERROR 7\n"
".emtcode TOKEN_PRAGMA 8\n"
".emtcode TOKEN_EXTENSION 9\n"
".emtcode TOKEN_LINE 10\n"
".emtcode PARAM_END 0\n"
".emtcode PARAM_PARAMETER 1\n"
".emtcode BEHAVIOR_REQUIRE 1\n"
".emtcode BEHAVIOR_ENABLE 2\n"
".emtcode BEHAVIOR_WARN 3\n"
".emtcode BEHAVIOR_DISABLE 4\n"
"source\n"
" optional_directive .and .loop source_element .and '\\0' .emit ESCAPE_TOKEN .emit TOKEN_END;\n"
"source_element\n"
" c_style_comment_block .or cpp_style_comment_block .or new_line_directive .or source_token;\n"
"c_style_comment_block\n"
" '/' .and '*' .and c_style_comment_rest .and .true .emit ' ';\n"
"c_style_comment_rest\n"
" .loop c_style_comment_body .and c_style_comment_end;\n"
"c_style_comment_body\n"
" c_style_comment_char_nostar .or c_style_comment_char_star_noslashstar;\n"
"c_style_comment_char_nostar\n"
" new_line .or '\\x2B'-'\\xFF' .or '\\x01'-'\\x29';\n"
"c_style_comment_char_star_noslashstar\n"
" '*' .and c_style_comment_char_star_noslashstar_1;\n"
"c_style_comment_char_star_noslashstar_1\n"
" c_style_comment_char_noslashstar .or c_style_comment_char_star_noslashstar;\n"
"c_style_comment_char_noslashstar\n"
" new_line .or '\\x30'-'\\xFF' .or '\\x01'-'\\x29' .or '\\x2B'-'\\x2E';\n"
"c_style_comment_end\n"
" '*' .and .loop c_style_comment_char_star .and '/';\n"
"c_style_comment_char_star\n"
" '*';\n"
"cpp_style_comment_block\n"
" '/' .and '/' .and cpp_style_comment_block_1;\n"
"cpp_style_comment_block_1\n"
" cpp_style_comment_block_2 .or cpp_style_comment_block_3;\n"
"cpp_style_comment_block_2\n"
" .loop cpp_style_comment_char .and new_line_directive;\n"
"cpp_style_comment_block_3\n"
" .loop cpp_style_comment_char;\n"
"cpp_style_comment_char\n"
" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"
"new_line_directive\n"
" new_line .and optional_directive;\n"
"new_line\n"
" generic_new_line .emit '\\n';\n"
"generic_new_line\n"
" carriage_return_line_feed .or line_feed_carriage_return .or '\\n' .or '\\r';\n"
"carriage_return_line_feed\n"
" '\\r' .and '\\n';\n"
"line_feed_carriage_return\n"
" '\\n' .and '\\r';\n"
"optional_directive\n"
" directive .emit ESCAPE_TOKEN .or .true;\n"
"directive\n"
" dir_define .emit TOKEN_DEFINE .or\n"
" dir_undef .emit TOKEN_UNDEF .or\n"
" dir_if .emit TOKEN_IF .or\n"
" dir_ifdef .emit TOKEN_IF .emit 'd' .emit 'e' .emit 'f' .emit 'i' .emit 'n' .emit 'e' .emit 'd'\n"
" .emit ' ' .or\n"
" dir_ifndef .emit TOKEN_IF .emit '!' .emit 'd' .emit 'e' .emit 'f' .emit 'i' .emit 'n' .emit 'e'\n"
" .emit 'd' .emit ' ' .or\n"
" dir_else .emit TOKEN_ELSE .or\n"
" dir_elif .emit TOKEN_ELIF .or\n"
" dir_endif .emit TOKEN_ENDIF .or\n"
" dir_ext .emit TOKEN_EXTENSION .or\n"
" dir_line .emit TOKEN_LINE;\n"
"dir_define\n"
" optional_space .and '#' .and optional_space .and \"define\" .and symbol .and opt_parameters .and\n"
" definition;\n"
"dir_undef\n"
" optional_space .and '#' .and optional_space .and \"undef\" .and symbol;\n"
"dir_if\n"
" optional_space .and '#' .and optional_space .and \"if\" .and expression;\n"
"dir_ifdef\n"
" optional_space .and '#' .and optional_space .and \"ifdef\" .and symbol;\n"
"dir_ifndef\n"
" optional_space .and '#' .and optional_space .and \"ifndef\" .and symbol;\n"
"dir_else\n"
" optional_space .and '#' .and optional_space .and \"else\";\n"
"dir_elif\n"
" optional_space .and '#' .and optional_space .and \"elif\" .and expression;\n"
"dir_endif\n"
" optional_space .and '#' .and optional_space .and \"endif\";\n"
"dir_ext\n"
" optional_space .and '#' .and optional_space .and \"extension\" .and space .and extension_name .and\n"
" optional_space .and ':' .and optional_space .and extension_behavior;\n"
"dir_line\n"
" optional_space .and '#' .and optional_space .and \"line\" .and expression;\n"
"symbol\n"
" space .and symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\\0';\n"
"opt_parameters\n"
" parameters .or .true .emit PARAM_END;\n"
"parameters\n"
" '(' .and parameters_1 .and optional_space .and ')' .emit PARAM_END;\n"
"parameters_1\n"
" parameters_2 .or .true;\n"
"parameters_2\n"
" parameter .emit PARAM_PARAMETER .and .loop parameters_3;\n"
"parameters_3\n"
" optional_space .and ',' .and parameter .emit PARAM_PARAMETER;\n"
"parameter\n"
" optional_space .and symbol_character .emit * .and .loop symbol_character2 .emit * .and\n"
" .true .emit '\\0';\n"
"definition\n"
" .loop definition_character .emit * .and .true .emit '\\0';\n"
"definition_character\n"
" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"
"expression\n"
" expression_element .and .loop expression_element .and .true .emit '\\0';\n"
"expression_element\n"
" expression_character .emit *;\n"
"expression_character\n"
" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"
"extension_name\n"
" symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\\0';\n"
"extension_behavior\n"
" \"require\" .emit BEHAVIOR_REQUIRE .or\n"
" \"enable\" .emit BEHAVIOR_ENABLE .or\n"
" \"warn\" .emit BEHAVIOR_WARN .or\n"
" \"disable\" .emit BEHAVIOR_DISABLE;\n"
"optional_space\n"
" .loop single_space;\n"
"space\n"
" single_space .and .loop single_space;\n"
"single_space\n"
" ' ' .or '\\t';\n"
"source_token\n"
" space .emit ' ' .or complex_token .or source_token_1;\n"
"source_token_1\n"
" simple_token .emit ' ' .and .true .emit ' ';\n"
"complex_token\n"
" identifier .or number;\n"
"simple_token\n"
" increment .or decrement .or lequal .or gequal .or equal .or nequal .or and .or xor .or or .or\n"
" addto .or subtractfrom .or multiplyto .or divideto .or other;\n"
"identifier\n"
" identifier_char1 .emit * .and .loop identifier_char2 .emit *;\n"
"identifier_char1\n"
" 'a'-'z' .or 'A'-'Z' .or '_';\n"
"identifier_char2\n"
" 'a'-'z' .or 'A'-'Z' .or '0'-'9' .or '_';\n"
"number\n"
" float .or integer;\n"
"digit_oct\n"
" '0'-'7';\n"
"digit_dec\n"
" '0'-'9';\n"
"digit_hex\n"
" '0'-'9' .or 'A'-'F' .or 'a'-'f';\n"
"float\n"
" float_1 .or float_2;\n"
"float_1\n"
" float_fractional_constant .and float_optional_exponent_part;\n"
"float_2\n"
" float_digit_sequence .and float_exponent_part;\n"
"float_fractional_constant\n"
" float_fractional_constant_1 .or float_fractional_constant_2 .or float_fractional_constant_3;\n"
"float_fractional_constant_1\n"
" float_digit_sequence .and '.' .emit '.' .and float_digit_sequence;\n"
"float_fractional_constant_2\n"
" float_digit_sequence .and '.' .emit '.';\n"
"float_fractional_constant_3\n"
" '.' .emit '.' .and float_digit_sequence;\n"
"float_optional_exponent_part\n"
" float_exponent_part .or .true;\n"
"float_digit_sequence\n"
" digit_dec .emit * .and .loop digit_dec .emit *;\n"
"float_exponent_part\n"
" float_exponent_part_1 .or float_exponent_part_2;\n"
"float_exponent_part_1\n"
" 'e' .emit 'e' .and float_optional_sign .and float_digit_sequence;\n"
"float_exponent_part_2\n"
" 'E' .emit 'E' .and float_optional_sign .and float_digit_sequence;\n"
"float_optional_sign\n"
" '+' .emit '+' .or '-' .emit '-' .or .true;\n"
"integer\n"
" integer_hex .or integer_oct .or integer_dec;\n"
"integer_hex\n"
" '0' .emit '0' .and integer_hex_1 .emit * .and digit_hex .emit * .and\n"
" .loop digit_hex .emit *;\n"
"integer_hex_1\n"
" 'x' .or 'X';\n"
"integer_oct\n"
" '0' .emit '0' .and .loop digit_oct .emit *;\n"
"integer_dec\n"
" digit_dec .emit * .and .loop digit_dec .emit *;\n"
"increment\n"
" '+' .emit * .and '+' .emit *;\n"
"decrement\n"
" '-' .emit * .and '-' .emit *;\n"
"lequal\n"
" '<' .emit * .and '=' .emit *;\n"
"gequal\n"
" '>' .emit * .and '=' .emit *;\n"
"equal\n"
" '=' .emit * .and '=' .emit *;\n"
"nequal\n"
" '!' .emit * .and '=' .emit *;\n"
"and\n"
" '&' .emit * .and '&' .emit *;\n"
"xor\n"
" '^' .emit * .and '^' .emit *;\n"
"or\n"
" '|' .emit * .and '|' .emit *;\n"
"addto\n"
" '+' .emit * .and '=' .emit *;\n"
"subtractfrom\n"
" '-' .emit * .and '=' .emit *;\n"
"multiplyto\n"
" '*' .emit * .and '=' .emit *;\n"
"divideto\n"
" '/' .emit * .and '=' .emit *;\n"
"other\n"
" '\\x24'-'\\xFF' .emit * .or '\\x01'-'\\x22' .emit *;\n"
"symbol_character\n"
" 'A'-'Z' .or 'a'-'z' .or '_';\n"
"symbol_character2\n"
" 'A'-'Z' .or 'a'-'z' .or '0'-'9' .or '_';\n"
".string string_lexer;\n"
"string_lexer\n"
" lex_first_identifier_character .and .loop lex_next_identifier_character;\n"
"lex_first_identifier_character\n"
" 'a'-'z' .or 'A'-'Z' .or '_';\n"
"lex_next_identifier_character\n"
" 'a'-'z' .or 'A'-'Z' .or '0'-'9' .or '_';\n"
""
@@ -1,265 +1,265 @@
/*
* 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_expression.syn
* slang preprocessor expression parser
* \author Michal Krol
*/
/*
* Parses one or two (optional) expressions on literal integer constants. Those expressions come
* from #if #elif and #line directives. The preprocessor already parsed those directives and
* expanded the expression (expressions). All occurences of the operator "defined" are already
* replaced with either "0" or "1" literals.
*/
.syntax expression;
/*
* Those separate individual expressions.
* For #if/#elif case it is: EXP_EXPRESSION ... EXP_END
* For #line case it may be: EXP_EXPRESSION ... EXP_EXPRESSION ... EXP_END
*/
.emtcode EXP_END 0
.emtcode EXP_EXPRESSION 1
.emtcode OP_END 0
.emtcode OP_PUSHINT 1
.emtcode OP_LOGICALOR 2
.emtcode OP_LOGICALAND 3
.emtcode OP_OR 4
.emtcode OP_XOR 5
.emtcode OP_AND 6
.emtcode OP_EQUAL 7
.emtcode OP_NOTEQUAL 8
.emtcode OP_LESSEQUAL 9
.emtcode OP_GREATEREQUAL 10
.emtcode OP_LESS 11
.emtcode OP_GREATER 12
.emtcode OP_LEFTSHIFT 13
.emtcode OP_RIGHTSHIFT 14
.emtcode OP_ADD 15
.emtcode OP_SUBTRACT 16
.emtcode OP_MULTIPLY 17
.emtcode OP_DIVIDE 18
.emtcode OP_MODULUS 19
.emtcode OP_PLUS 20
.emtcode OP_MINUS 21
.emtcode OP_NEGATE 22
.emtcode OP_COMPLEMENT 23
expression
first_expression .and optional_second_expression .and optional_space .and '\0' .emit EXP_END;
first_expression
optional_space .and logical_or_expression .emit EXP_EXPRESSION .and .true .emit OP_END;
optional_second_expression
second_expression .or .true;
second_expression
space .and logical_or_expression .emit EXP_EXPRESSION .and .true .emit OP_END;
logical_or_expression
logical_and_expression .and .loop logical_or_expression_1;
logical_or_expression_1
barbar .and logical_and_expression .and .true .emit OP_LOGICALOR;
logical_and_expression
or_expression .and .loop logical_and_expression_1;
logical_and_expression_1
ampersandampersand .and or_expression .and .true .emit OP_LOGICALAND;
or_expression
xor_expression .and .loop or_expression_1;
or_expression_1
bar .and xor_expression .and .true .emit OP_OR;
xor_expression
and_expression .and .loop xor_expression_1;
xor_expression_1
caret .and and_expression .and .true .emit OP_XOR;
and_expression
equality_expression .and .loop and_expression_1;
and_expression_1
ampersand .and equality_expression .and .true .emit OP_AND;
equality_expression
relational_expression .and .loop equality_expression_1;
equality_expression_1
equality_expression_2 .or equality_expression_3;
equality_expression_2
equalsequals .and relational_expression .and .true .emit OP_EQUAL;
equality_expression_3
bangequals .and relational_expression .and .true .emit OP_NOTEQUAL;
relational_expression
shift_expression .and .loop relational_expression_1;
relational_expression_1
relational_expression_2 .or relational_expression_3 .or relational_expression_4 .or
relational_expression_5;
relational_expression_2
lessequals .and shift_expression .and .true .emit OP_LESSEQUAL;
relational_expression_3
greaterequals .and shift_expression .and .true .emit OP_GREATEREQUAL;
relational_expression_4
less .and shift_expression .and .true .emit OP_LESS;
relational_expression_5
greater .and shift_expression .and .true .emit OP_GREATER;
shift_expression
additive_expression .and .loop shift_expression_1;
shift_expression_1
shift_expression_2 .or shift_expression_3;
shift_expression_2
lessless .and additive_expression .and .true .emit OP_LEFTSHIFT;
shift_expression_3
greatergreater .and additive_expression .and .true .emit OP_RIGHTSHIFT;
additive_expression
multiplicative_expression .and .loop additive_expression_1;
additive_expression_1
additive_expression_2 .or additive_expression_3;
additive_expression_2
plus .and multiplicative_expression .and .true .emit OP_ADD;
additive_expression_3
dash .and multiplicative_expression .and .true .emit OP_SUBTRACT;
multiplicative_expression
unary_expression .and .loop multiplicative_expression_1;
multiplicative_expression_1
multiplicative_expression_2 .or multiplicative_expression_3 .or multiplicative_expression_4;
multiplicative_expression_2
star .and unary_expression .and .true .emit OP_MULTIPLY;
multiplicative_expression_3
slash .and unary_expression .and .true .emit OP_DIVIDE;
multiplicative_expression_4
percent .and unary_expression .and .true .emit OP_MODULUS;
unary_expression
primary_expression .or unary_expression_1 .or unary_expression_2 .or unary_expression_3 .or
unary_expression_4;
unary_expression_1
plus .and unary_expression .and .true .emit OP_PLUS;
unary_expression_2
dash .and unary_expression .and .true .emit OP_MINUS;
unary_expression_3
bang .and unary_expression .and .true .emit OP_NEGATE;
unary_expression_4
tilda .and unary_expression .and .true .emit OP_COMPLEMENT;
primary_expression
intconstant .or primary_expression_1;
primary_expression_1
lparen .and logical_or_expression .and rparen;
intconstant
integer .emit OP_PUSHINT;
integer
integer_dec;
integer_dec
digit_dec .emit 10 .emit * .and .loop digit_dec .emit * .and .true .emit '\0';
digit_dec
'0'-'9';
optional_space
.loop single_space;
space
single_space .and .loop single_space;
single_space
' ' .or '\t';
ampersand
optional_space .and '&' .and optional_space;
ampersandampersand
optional_space .and '&' .and '&' .and optional_space;
bang
optional_space .and '!' .and optional_space;
bangequals
optional_space .and '!' .and '=' .and optional_space;
bar
optional_space .and '|' .and optional_space;
barbar
optional_space .and '|' .and '|' .and optional_space;
caret
optional_space .and '^' .and optional_space;
dash
optional_space .and '-' .and optional_space;
equalsequals
optional_space .and '=' .and '=' .and optional_space;
greater
optional_space .and '>' .and optional_space;
greaterequals
optional_space .and '>' .and '=' .and optional_space;
greatergreater
optional_space .and '>' .and '>' .and optional_space;
less
optional_space .and '<' .and optional_space;
lessequals
optional_space .and '<' .and '=' .and optional_space;
lessless
optional_space .and '<' .and '<' .and optional_space;
lparen
optional_space .and '(' .and optional_space;
percent
optional_space .and '%' .and optional_space;
plus
optional_space .and '+' .and optional_space;
rparen
optional_space .and ')' .and optional_space;
slash
optional_space .and '/' .and optional_space;
star
optional_space .and '*' .and optional_space;
tilda
optional_space .and '~' .and optional_space;
/*
* 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_expression.syn
* slang preprocessor expression parser
* \author Michal Krol
*/
/*
* Parses one or two (optional) expressions on literal integer constants. Those expressions come
* from #if #elif and #line directives. The preprocessor already parsed those directives and
* expanded the expression (expressions). All occurences of the operator "defined" are already
* replaced with either "0" or "1" literals.
*/
.syntax expression;
/*
* Those separate individual expressions.
* For #if/#elif case it is: EXP_EXPRESSION ... EXP_END
* For #line case it may be: EXP_EXPRESSION ... EXP_EXPRESSION ... EXP_END
*/
.emtcode EXP_END 0
.emtcode EXP_EXPRESSION 1
.emtcode OP_END 0
.emtcode OP_PUSHINT 1
.emtcode OP_LOGICALOR 2
.emtcode OP_LOGICALAND 3
.emtcode OP_OR 4
.emtcode OP_XOR 5
.emtcode OP_AND 6
.emtcode OP_EQUAL 7
.emtcode OP_NOTEQUAL 8
.emtcode OP_LESSEQUAL 9
.emtcode OP_GREATEREQUAL 10
.emtcode OP_LESS 11
.emtcode OP_GREATER 12
.emtcode OP_LEFTSHIFT 13
.emtcode OP_RIGHTSHIFT 14
.emtcode OP_ADD 15
.emtcode OP_SUBTRACT 16
.emtcode OP_MULTIPLY 17
.emtcode OP_DIVIDE 18
.emtcode OP_MODULUS 19
.emtcode OP_PLUS 20
.emtcode OP_MINUS 21
.emtcode OP_NEGATE 22
.emtcode OP_COMPLEMENT 23
expression
first_expression .and optional_second_expression .and optional_space .and '\0' .emit EXP_END;
first_expression
optional_space .and logical_or_expression .emit EXP_EXPRESSION .and .true .emit OP_END;
optional_second_expression
second_expression .or .true;
second_expression
space .and logical_or_expression .emit EXP_EXPRESSION .and .true .emit OP_END;
logical_or_expression
logical_and_expression .and .loop logical_or_expression_1;
logical_or_expression_1
barbar .and logical_and_expression .and .true .emit OP_LOGICALOR;
logical_and_expression
or_expression .and .loop logical_and_expression_1;
logical_and_expression_1
ampersandampersand .and or_expression .and .true .emit OP_LOGICALAND;
or_expression
xor_expression .and .loop or_expression_1;
or_expression_1
bar .and xor_expression .and .true .emit OP_OR;
xor_expression
and_expression .and .loop xor_expression_1;
xor_expression_1
caret .and and_expression .and .true .emit OP_XOR;
and_expression
equality_expression .and .loop and_expression_1;
and_expression_1
ampersand .and equality_expression .and .true .emit OP_AND;
equality_expression
relational_expression .and .loop equality_expression_1;
equality_expression_1
equality_expression_2 .or equality_expression_3;
equality_expression_2
equalsequals .and relational_expression .and .true .emit OP_EQUAL;
equality_expression_3
bangequals .and relational_expression .and .true .emit OP_NOTEQUAL;
relational_expression
shift_expression .and .loop relational_expression_1;
relational_expression_1
relational_expression_2 .or relational_expression_3 .or relational_expression_4 .or
relational_expression_5;
relational_expression_2
lessequals .and shift_expression .and .true .emit OP_LESSEQUAL;
relational_expression_3
greaterequals .and shift_expression .and .true .emit OP_GREATEREQUAL;
relational_expression_4
less .and shift_expression .and .true .emit OP_LESS;
relational_expression_5
greater .and shift_expression .and .true .emit OP_GREATER;
shift_expression
additive_expression .and .loop shift_expression_1;
shift_expression_1
shift_expression_2 .or shift_expression_3;
shift_expression_2
lessless .and additive_expression .and .true .emit OP_LEFTSHIFT;
shift_expression_3
greatergreater .and additive_expression .and .true .emit OP_RIGHTSHIFT;
additive_expression
multiplicative_expression .and .loop additive_expression_1;
additive_expression_1
additive_expression_2 .or additive_expression_3;
additive_expression_2
plus .and multiplicative_expression .and .true .emit OP_ADD;
additive_expression_3
dash .and multiplicative_expression .and .true .emit OP_SUBTRACT;
multiplicative_expression
unary_expression .and .loop multiplicative_expression_1;
multiplicative_expression_1
multiplicative_expression_2 .or multiplicative_expression_3 .or multiplicative_expression_4;
multiplicative_expression_2
star .and unary_expression .and .true .emit OP_MULTIPLY;
multiplicative_expression_3
slash .and unary_expression .and .true .emit OP_DIVIDE;
multiplicative_expression_4
percent .and unary_expression .and .true .emit OP_MODULUS;
unary_expression
primary_expression .or unary_expression_1 .or unary_expression_2 .or unary_expression_3 .or
unary_expression_4;
unary_expression_1
plus .and unary_expression .and .true .emit OP_PLUS;
unary_expression_2
dash .and unary_expression .and .true .emit OP_MINUS;
unary_expression_3
bang .and unary_expression .and .true .emit OP_NEGATE;
unary_expression_4
tilda .and unary_expression .and .true .emit OP_COMPLEMENT;
primary_expression
intconstant .or primary_expression_1;
primary_expression_1
lparen .and logical_or_expression .and rparen;
intconstant
integer .emit OP_PUSHINT;
integer
integer_dec;
integer_dec
digit_dec .emit 10 .emit * .and .loop digit_dec .emit * .and .true .emit '\0';
digit_dec
'0'-'9';
optional_space
.loop single_space;
space
single_space .and .loop single_space;
single_space
' ' .or '\t';
ampersand
optional_space .and '&' .and optional_space;
ampersandampersand
optional_space .and '&' .and '&' .and optional_space;
bang
optional_space .and '!' .and optional_space;
bangequals
optional_space .and '!' .and '=' .and optional_space;
bar
optional_space .and '|' .and optional_space;
barbar
optional_space .and '|' .and '|' .and optional_space;
caret
optional_space .and '^' .and optional_space;
dash
optional_space .and '-' .and optional_space;
equalsequals
optional_space .and '=' .and '=' .and optional_space;
greater
optional_space .and '>' .and optional_space;
greaterequals
optional_space .and '>' .and '=' .and optional_space;
greatergreater
optional_space .and '>' .and '>' .and optional_space;
less
optional_space .and '<' .and optional_space;
lessequals
optional_space .and '<' .and '=' .and optional_space;
lessless
optional_space .and '<' .and '<' .and optional_space;
lparen
optional_space .and '(' .and optional_space;
percent
optional_space .and '%' .and optional_space;
plus
optional_space .and '+' .and optional_space;
rparen
optional_space .and ')' .and optional_space;
slash
optional_space .and '/' .and optional_space;
star
optional_space .and '*' .and optional_space;
tilda
optional_space .and '~' .and optional_space;
@@ -1,234 +1,179 @@
/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED FROM THE .syn FILE */
"
\n"
"
\n"
"
\n"
"
\n"
"
\n"
"
\n"
".syntax expression;
\n"
"
\n"
"
\n"
".emtcode EXP_END 0
\n"
".emtcode EXP_EXPRESSION 1
\n"
"
\n"
".emtcode OP_END 0
\n"
".emtcode OP_PUSHINT 1
\n"
".emtcode OP_LOGICALOR 2
\n"
".emtcode OP_LOGICALAND 3
\n"
".emtcode OP_OR 4
\n"
".emtcode OP_XOR 5
\n"
".emtcode OP_AND 6
\n"
".emtcode OP_EQUAL 7
\n"
".emtcode OP_NOTEQUAL 8
\n"
".emtcode OP_LESSEQUAL 9
\n"
".emtcode OP_GREATEREQUAL 10
\n"
".emtcode OP_LESS 11
\n"
".emtcode OP_GREATER 12
\n"
".emtcode OP_LEFTSHIFT 13
\n"
".emtcode OP_RIGHTSHIFT 14
\n"
".emtcode OP_ADD 15
\n"
".emtcode OP_SUBTRACT 16
\n"
".emtcode OP_MULTIPLY 17
\n"
".emtcode OP_DIVIDE 18
\n"
".emtcode OP_MODULUS 19
\n"
".emtcode OP_PLUS 20
\n"
".emtcode OP_MINUS 21
\n"
".emtcode OP_NEGATE 22
\n"
".emtcode OP_COMPLEMENT 23
\n"
"
\n"
"expression
\n"
" first_expression .and optional_second_expression .and optional_space .and '\\0' .emit EXP_END;
\n"
"
\n"
"first_expression
\n"
" optional_space .and logical_or_expression .emit EXP_EXPRESSION .and .true .emit OP_END;
\n"
"
\n"
"optional_second_expression
\n"
" second_expression .or .true;
\n"
"
\n"
"second_expression
\n"
" space .and logical_or_expression .emit EXP_EXPRESSION .and .true .emit OP_END;
\n"
"
\n"
"logical_or_expression
\n"
" logical_and_expression .and .loop logical_or_expression_1;
\n"
"logical_or_expression_1
\n"
" barbar .and logical_and_expression .and .true .emit OP_LOGICALOR;
\n"
"
\n"
"logical_and_expression
\n"
" or_expression .and .loop logical_and_expression_1;
\n"
"logical_and_expression_1
\n"
" ampersandampersand .and or_expression .and .true .emit OP_LOGICALAND;
\n"
"
\n"
"or_expression
\n"
" xor_expression .and .loop or_expression_1;
\n"
"or_expression_1
\n"
" bar .and xor_expression .and .true .emit OP_OR;
\n"
"
\n"
"xor_expression
\n"
" and_expression .and .loop xor_expression_1;
\n"
"xor_expression_1
\n"
" caret .and and_expression .and .true .emit OP_XOR;
\n"
"
\n"
"and_expression
\n"
" equality_expression .and .loop and_expression_1;
\n"
"and_expression_1
\n"
" ampersand .and equality_expression .and .true .emit OP_AND;
\n"
"
\n"
"equality_expression
\n"
" relational_expression .and .loop equality_expression_1;
\n"
"equality_expression_1
\n"
" equality_expression_2 .or equality_expression_3;
\n"
"equality_expression_2
\n"
" equalsequals .and relational_expression .and .true .emit OP_EQUAL;
\n"
"equality_expression_3
\n"
" bangequals .and relational_expression .and .true .emit OP_NOTEQUAL;
\n"
"
\n"
"relational_expression
\n"
" shift_expression .and .loop relational_expression_1;
\n"
"relational_expression_1
\n"
" relational_expression_2 .or relational_expression_3 .or relational_expression_4 .or
\n"
" relational_expression_5;
\n"
"relational_expression_2
\n"
" lessequals .and shift_expression .and .true .emit OP_LESSEQUAL;
\n"
"relational_expression_3
\n"
" greaterequals .and shift_expression .and .true .emit OP_GREATEREQUAL;
\n"
"relational_expression_4
\n"
" less .and shift_expression .and .true .emit OP_LESS;
\n"
"relational_expression_5
\n"
" greater .and shift_expression .and .true .emit OP_GREATER;
\n"
"
\n"
"shift_expression
\n"
" additive_expression .and .loop shift_expression_1;
\n"
"shift_expression_1
\n"
" shift_expression_2 .or shift_expression_3;
\n"
"shift_expression_2
\n"
" lessless .and additive_expression .and .true .emit OP_LEFTSHIFT;
\n"
"shift_expression_3
\n"
" greatergreater .and additive_expression .and .true .emit OP_RIGHTSHIFT;
\n"
"
\n"
"additive_expression
\n"
" multiplicative_expression .and .loop additive_expression_1;
\n"
"additive_expression_1
\n"
" additive_expression_2 .or additive_expression_3;
\n"
"additive_expression_2
\n"
" plus .and multiplicative_expression .and .true .emit OP_ADD;
\n"
"additive_expression_3
\n"
" dash .and multiplicative_expression .and .true .emit OP_SUBTRACT;
\n"
"
\n"
".syntax expression;\n"
".emtcode EXP_END 0\n"
".emtcode EXP_EXPRESSION 1\n"
".emtcode OP_END 0\n"
".emtcode OP_PUSHINT 1\n"
".emtcode OP_LOGICALOR 2\n"
".emtcode OP_LOGICALAND 3\n"
".emtcode OP_OR 4\n"
".emtcode OP_XOR 5\n"
".emtcode OP_AND 6\n"
".emtcode OP_EQUAL 7\n"
".emtcode OP_NOTEQUAL 8\n"
".emtcode OP_LESSEQUAL 9\n"
".emtcode OP_GREATEREQUAL 10\n"
".emtcode OP_LESS 11\n"
".emtcode OP_GREATER 12\n"
".emtcode OP_LEFTSHIFT 13\n"
".emtcode OP_RIGHTSHIFT 14\n"
".emtcode OP_ADD 15\n"
".emtcode OP_SUBTRACT 16\n"
".emtcode OP_MULTIPLY 17\n"
".emtcode OP_DIVIDE 18\n"
".emtcode OP_MODULUS 19\n"
".emtcode OP_PLUS 20\n"
".emtcode OP_MINUS 21\n"
".emtcode OP_NEGATE 22\n"
".emtcode OP_COMPLEMENT 23\n"
"expression\n"
" first_expression .and optional_second_expression .and optional_space .and '\\0' .emit EXP_END;\n"
"first_expression\n"
" optional_space .and logical_or_expression .emit EXP_EXPRESSION .and .true .emit OP_END;\n"
"optional_second_expression\n"
" second_expression .or .true;\n"
"second_expression\n"
" space .and logical_or_expression .emit EXP_EXPRESSION .and .true .emit OP_END;\n"
"logical_or_expression\n"
" logical_and_expression .and .loop logical_or_expression_1;\n"
"logical_or_expression_1\n"
" barbar .and logical_and_expression .and .true .emit OP_LOGICALOR;\n"
"logical_and_expression\n"
" or_expression .and .loop logical_and_expression_1;\n"
"logical_and_expression_1\n"
" ampersandampersand .and or_expression .and .true .emit OP_LOGICALAND;\n"
"or_expression\n"
" xor_expression .and .loop or_expression_1;\n"
"or_expression_1\n"
" bar .and xor_expression .and .true .emit OP_OR;\n"
"xor_expression\n"
" and_expression .and .loop xor_expression_1;\n"
"xor_expression_1\n"
" caret .and and_expression .and .true .emit OP_XOR;\n"
"and_expression\n"
" equality_expression .and .loop and_expression_1;\n"
"and_expression_1\n"
" ampersand .and equality_expression .and .true .emit OP_AND;\n"
"equality_expression\n"
" relational_expression .and .loop equality_expression_1;\n"
"equality_expression_1\n"
" equality_expression_2 .or equality_expression_3;\n"
"equality_expression_2\n"
" equalsequals .and relational_expression .and .true .emit OP_EQUAL;\n"
"equality_expression_3\n"
" bangequals .and relational_expression .and .true .emit OP_NOTEQUAL;\n"
"relational_expression\n"
" shift_expression .and .loop relational_expression_1;\n"
"relational_expression_1\n"
" relational_expression_2 .or relational_expression_3 .or relational_expression_4 .or\n"
" relational_expression_5;\n"
"relational_expression_2\n"
" lessequals .and shift_expression .and .true .emit OP_LESSEQUAL;\n"
"relational_expression_3\n"
" greaterequals .and shift_expression .and .true .emit OP_GREATEREQUAL;\n"
"relational_expression_4\n"
" less .and shift_expression .and .true .emit OP_LESS;\n"
"relational_expression_5\n"
" greater .and shift_expression .and .true .emit OP_GREATER;\n"
"shift_expression\n"
" additive_expression .and .loop shift_expression_1;\n"
"shift_expression_1\n"
" shift_expression_2 .or shift_expression_3;\n"
"shift_expression_2\n"
" lessless .and additive_expression .and .true .emit OP_LEFTSHIFT;\n"
"shift_expression_3\n"
" greatergreater .and additive_expression .and .true .emit OP_RIGHTSHIFT;\n"
"additive_expression\n"
" multiplicative_expression .and .loop additive_expression_1;\n"
"additive_expression_1\n"
" additive_expression_2 .or additive_expression_3;\n"
"additive_expression_2\n"
" plus .and multiplicative_expression .and .true .emit OP_ADD;\n"
"additive_expression_3\n"
" dash .and multiplicative_expression .and .true .emit OP_SUBTRACT;\n"
"multiplicative_expression\n"
" unary_expression .and .loop multiplicative_expression_1;\n"
"multiplicative_expression_1\n"
" multiplicative_expression_2 .or multiplicative_expression_3 .or multiplicative_expression_4;\n"
"multiplicative_expression_2\n"
" star .and unary_expression .and .true .emit OP_MULTIPLY;\n"
"multiplicative_expression_3\n"
" slash .and unary_expression .and .true .emit OP_DIVIDE;\n"
"multiplicative_expression_4\n"
" percent .and unary_expression .and .true .emit OP_MODULUS;\n"
"unary_expression\n"
" primary_expression .or unary_expression_1 .or unary_expression_2 .or unary_expression_3 .or\n"
" unary_expression_4;\n"
"unary_expression_1\n"
" plus .and unary_expression .and .true .emit OP_PLUS;\n"
"unary_expression_2\n"
" dash .and unary_expression .and .true .emit OP_MINUS;\n"
"unary_expression_3\n"
" bang .and unary_expression .and .true .emit OP_NEGATE;\n"
"unary_expression_4\n"
" tilda .and unary_expression .and .true .emit OP_COMPLEMENT;\n"
"primary_expression\n"
" intconstant .or primary_expression_1;\n"
"primary_expression_1\n"
" lparen .and logical_or_expression .and rparen;\n"
"intconstant\n"
" integer .emit OP_PUSHINT;\n"
"integer\n"
" integer_dec;\n"
"integer_dec\n"
" digit_dec .emit 10 .emit * .and .loop digit_dec .emit * .and .true .emit '\\0';\n"
"digit_dec\n"
" '0'-'9';\n"
"optional_space\n"
" .loop single_space;\n"
"space\n"
" single_space .and .loop single_space;\n"
"single_space\n"
" ' ' .or '\\t';\n"
"ampersand\n"
" optional_space .and '&' .and optional_space;\n"
"ampersandampersand\n"
" optional_space .and '&' .and '&' .and optional_space;\n"
"bang\n"
" optional_space .and '!' .and optional_space;\n"
"bangequals\n"
" optional_space .and '!' .and '=' .and optional_space;\n"
"bar\n"
" optional_space .and '|' .and optional_space;\n"
"barbar\n"
" optional_space .and '|' .and '|' .and optional_space;\n"
"caret\n"
" optional_space .and '^' .and optional_space;\n"
"dash\n"
" optional_space .and '-' .and optional_space;\n"
"equalsequals\n"
" optional_space .and '=' .and '=' .and optional_space;\n"
"greater\n"
" optional_space .and '>' .and optional_space;\n"
"greaterequals\n"
" optional_space .and '>' .and '=' .and optional_space;\n"
"greatergreater\n"
" optional_space .and '>' .and '>' .and optional_space;\n"
"less\n"
" optional_space .and '<' .and optional_space;\n"
"lessequals\n"
" optional_space .and '<' .and '=' .and optional_space;\n"
"lessless\n"
" optional_space .and '<' .and '<' .and optional_space;\n"
"lparen\n"
" optional_space .and '(' .and optional_space;\n"
"percent\n"
" optional_space .and '%' .and optional_space;\n"
"plus\n"
" optional_space .and '+' .and optional_space;\n"
"rparen\n"
" optional_space .and ')' .and optional_space;\n"
"slash\n"
" optional_space .and '/' .and optional_space;\n"
"star\n"
" optional_space .and '*' .and optional_space;\n"
"tilda\n"
" optional_space .and '~' .and optional_space;\n"
""