1a841e1ebSBaptiste Daroussin %{ 28ce3644cSJung-uk Kim /* $OpenBSD: parser.y,v 1.7 2012/04/12 17:00:11 espie Exp $ */ 3a841e1ebSBaptiste Daroussin /* 4a841e1ebSBaptiste Daroussin * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org> 5a841e1ebSBaptiste Daroussin * 6a841e1ebSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any 7a841e1ebSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above 8a841e1ebSBaptiste Daroussin * copyright notice and this permission notice appear in all copies. 9a841e1ebSBaptiste Daroussin * 10a841e1ebSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11a841e1ebSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12a841e1ebSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13a841e1ebSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14a841e1ebSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15a841e1ebSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16a841e1ebSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17a841e1ebSBaptiste Daroussin */ 18eccad222SEd Schouten 194fff7a14SBaptiste Daroussin #include <math.h> 20bdb6d172SBaptiste Daroussin #include <stdint.h> 21a841e1ebSBaptiste Daroussin #define YYSTYPE int32_t 22*31129d4fSBaptiste Daroussin extern int32_t end_result; 23a841e1ebSBaptiste Daroussin extern int yylex(void); 24a841e1ebSBaptiste Daroussin extern int yyerror(const char *); 25a841e1ebSBaptiste Daroussin %} 26a841e1ebSBaptiste Daroussin %token NUMBER 27a841e1ebSBaptiste Daroussin %token ERROR 28a841e1ebSBaptiste Daroussin %left LOR 29a841e1ebSBaptiste Daroussin %left LAND 30a841e1ebSBaptiste Daroussin %left '|' 31a841e1ebSBaptiste Daroussin %left '^' 32a841e1ebSBaptiste Daroussin %left '&' 33a841e1ebSBaptiste Daroussin %left EQ NE 34a841e1ebSBaptiste Daroussin %left '<' LE '>' GE 35a841e1ebSBaptiste Daroussin %left LSHIFT RSHIFT 36a841e1ebSBaptiste Daroussin %left '+' '-' 37a841e1ebSBaptiste Daroussin %left '*' '/' '%' 38bdb6d172SBaptiste Daroussin %right EXPONENT 39a841e1ebSBaptiste Daroussin %right UMINUS UPLUS '!' '~' 40a841e1ebSBaptiste Daroussin 41a841e1ebSBaptiste Daroussin %% 42a841e1ebSBaptiste Daroussin 43a841e1ebSBaptiste Daroussin top : expr { end_result = $1; } 44a841e1ebSBaptiste Daroussin ; 45a841e1ebSBaptiste Daroussin expr : expr '+' expr { $$ = $1 + $3; } 46a841e1ebSBaptiste Daroussin | expr '-' expr { $$ = $1 - $3; } 474fff7a14SBaptiste Daroussin | expr EXPONENT expr { $$ = pow($1, $3); } 48a841e1ebSBaptiste Daroussin | expr '*' expr { $$ = $1 * $3; } 49a841e1ebSBaptiste Daroussin | expr '/' expr { 50a841e1ebSBaptiste Daroussin if ($3 == 0) { 51a841e1ebSBaptiste Daroussin yyerror("division by zero"); 52a841e1ebSBaptiste Daroussin exit(1); 53a841e1ebSBaptiste Daroussin } 54a841e1ebSBaptiste Daroussin $$ = $1 / $3; 55a841e1ebSBaptiste Daroussin } 56a841e1ebSBaptiste Daroussin | expr '%' expr { 57a841e1ebSBaptiste Daroussin if ($3 == 0) { 58a841e1ebSBaptiste Daroussin yyerror("modulo zero"); 59a841e1ebSBaptiste Daroussin exit(1); 60a841e1ebSBaptiste Daroussin } 61a841e1ebSBaptiste Daroussin $$ = $1 % $3; 62a841e1ebSBaptiste Daroussin } 63a841e1ebSBaptiste Daroussin | expr LSHIFT expr { $$ = $1 << $3; } 64a841e1ebSBaptiste Daroussin | expr RSHIFT expr { $$ = $1 >> $3; } 65a841e1ebSBaptiste Daroussin | expr '<' expr { $$ = $1 < $3; } 66a841e1ebSBaptiste Daroussin | expr '>' expr { $$ = $1 > $3; } 67a841e1ebSBaptiste Daroussin | expr LE expr { $$ = $1 <= $3; } 68a841e1ebSBaptiste Daroussin | expr GE expr { $$ = $1 >= $3; } 69a841e1ebSBaptiste Daroussin | expr EQ expr { $$ = $1 == $3; } 70a841e1ebSBaptiste Daroussin | expr NE expr { $$ = $1 != $3; } 71a841e1ebSBaptiste Daroussin | expr '&' expr { $$ = $1 & $3; } 72a841e1ebSBaptiste Daroussin | expr '^' expr { $$ = $1 ^ $3; } 73a841e1ebSBaptiste Daroussin | expr '|' expr { $$ = $1 | $3; } 74a841e1ebSBaptiste Daroussin | expr LAND expr { $$ = $1 && $3; } 75a841e1ebSBaptiste Daroussin | expr LOR expr { $$ = $1 || $3; } 76a841e1ebSBaptiste Daroussin | '(' expr ')' { $$ = $2; } 77a841e1ebSBaptiste Daroussin | '-' expr %prec UMINUS { $$ = -$2; } 78a841e1ebSBaptiste Daroussin | '+' expr %prec UPLUS { $$ = $2; } 79a841e1ebSBaptiste Daroussin | '!' expr { $$ = !$2; } 80a841e1ebSBaptiste Daroussin | '~' expr { $$ = ~$2; } 81a841e1ebSBaptiste Daroussin | NUMBER 82a841e1ebSBaptiste Daroussin ; 83a841e1ebSBaptiste Daroussin %% 84a841e1ebSBaptiste Daroussin 85