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