188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick/*
288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * Copyright © 2010 Intel Corporation
388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick *
488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a
588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * copy of this software and associated documentation files (the "Software"),
688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * to deal in the Software without restriction, including without limitation
788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the
988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * Software is furnished to do so, subject to the following conditions:
1088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick *
1188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * The above copyright notice and this permission notice (including the next
1288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * paragraph) shall be included in all copies or substantial portions of the
1388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * Software.
1488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick *
1588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick * DEALINGS IN THE SOFTWARE.
2288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick */
23497baf4e4a6a0a2f247c7bfb9bf69a2b93c2c19fIan Romanick#include <assert.h>
2488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick#include "ast.h"
2588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
2688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickconst char *
2788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickast_expression::operator_string(enum ast_operators op)
2888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick{
2988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   static const char *const operators[] = {
3088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "=",
3188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "+",
3288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "-",
3388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "+",
3488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "-",
3588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "*",
3688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "/",
3788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "%",
3888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "<<",
3988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      ">>",
4088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "<",
4188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      ">",
4288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "<=",
4388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      ">=",
4488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "==",
4588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "!=",
4688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "&",
4788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "^",
4888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "|",
4988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "~",
5088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "&&",
5188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "^^",
522f9ca7dce2adea10d7947e98690b729cce947938Eric Anholt      "||",
5388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "!",
5488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
5588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "*=",
5688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "/=",
5788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "%=",
5888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "+=",
5988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "-=",
6088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "<<=",
6188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      ">>=",
6288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "&=",
6388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "^=",
6488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "|=",
6588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
6688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "?:",
672f9ca7dce2adea10d7947e98690b729cce947938Eric Anholt
6888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "++",
6988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "--",
7088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "++",
7188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      "--",
7288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      ".",
7388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   };
7488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
752f9ca7dce2adea10d7947e98690b729cce947938Eric Anholt   assert((unsigned int)op < sizeof(operators) / sizeof(operators[0]));
762f9ca7dce2adea10d7947e98690b729cce947938Eric Anholt
7788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   return operators[op];
7888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick}
7988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
8088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
8188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickast_expression_bin::ast_expression_bin(int oper, ast_expression *ex0,
8288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick				       ast_expression *ex1) :
8388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   ast_expression(oper, ex0, ex1, NULL)
8488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick{
8588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   assert((oper >= ast_plus) && (oper <= ast_logic_not));
8688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick}
8788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
8888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
8988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickvoid
9088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanickast_expression_bin::print(void) const
9188349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick{
9288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   subexpressions[0]->print();
9388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   printf("%s ", operator_string(oper));
9488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   subexpressions[1]->print();
9588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick}
96