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

