168d37339Sespie %{ 2*a45fdd0cSespie /* $OpenBSD: parser.y,v 1.7 2012/04/12 17:00:11 espie Exp $ */ 368d37339Sespie /* 468d37339Sespie * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org> 568d37339Sespie * 668d37339Sespie * Permission to use, copy, modify, and distribute this software for any 768d37339Sespie * purpose with or without fee is hereby granted, provided that the above 868d37339Sespie * copyright notice and this permission notice appear in all copies. 968d37339Sespie * 1068d37339Sespie * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1168d37339Sespie * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1268d37339Sespie * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1368d37339Sespie * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1468d37339Sespie * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1568d37339Sespie * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1668d37339Sespie * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1768d37339Sespie */ 18*a45fdd0cSespie #include <math.h> 190b7a013eSespie #include <stdint.h> 2068d37339Sespie #define YYSTYPE int32_t 2168d37339Sespie extern int32_t end_result; 2268d37339Sespie extern int yylex(void); 2368d37339Sespie extern int yyerror(const char *); 2468d37339Sespie %} 2568d37339Sespie %token NUMBER 2681e4efa8Sespie %token ERROR 2768d37339Sespie %left LOR 2868d37339Sespie %left LAND 2968d37339Sespie %left '|' 3068d37339Sespie %left '^' 3168d37339Sespie %left '&' 3268d37339Sespie %left EQ NE 3368d37339Sespie %left '<' LE '>' GE 3468d37339Sespie %left LSHIFT RSHIFT 3568d37339Sespie %left '+' '-' 3668d37339Sespie %left '*' '/' '%' 37*a45fdd0cSespie %right EXPONENT 3868d37339Sespie %right UMINUS UPLUS '!' '~' 3968d37339Sespie 4068d37339Sespie %% 4168d37339Sespie 4268d37339Sespie top : expr { end_result = $1; } 4368d37339Sespie ; 4468d37339Sespie expr : expr '+' expr { $$ = $1 + $3; } 4568d37339Sespie | expr '-' expr { $$ = $1 - $3; } 46*a45fdd0cSespie | expr EXPONENT expr { $$ = pow($1, $3); } 4768d37339Sespie | expr '*' expr { $$ = $1 * $3; } 484e297bc3Sotto | expr '/' expr { 494e297bc3Sotto if ($3 == 0) { 504e297bc3Sotto yyerror("division by zero"); 514e297bc3Sotto exit(1); 524e297bc3Sotto } 534e297bc3Sotto $$ = $1 / $3; 544e297bc3Sotto } 554e297bc3Sotto | expr '%' expr { 564e297bc3Sotto if ($3 == 0) { 574e297bc3Sotto yyerror("modulo zero"); 584e297bc3Sotto exit(1); 594e297bc3Sotto } 604e297bc3Sotto $$ = $1 % $3; 614e297bc3Sotto } 6268d37339Sespie | expr LSHIFT expr { $$ = $1 << $3; } 6368d37339Sespie | expr RSHIFT expr { $$ = $1 >> $3; } 6468d37339Sespie | expr '<' expr { $$ = $1 < $3; } 6568d37339Sespie | expr '>' expr { $$ = $1 > $3; } 6668d37339Sespie | expr LE expr { $$ = $1 <= $3; } 6768d37339Sespie | expr GE expr { $$ = $1 >= $3; } 6868d37339Sespie | expr EQ expr { $$ = $1 == $3; } 6968d37339Sespie | expr NE expr { $$ = $1 != $3; } 7068d37339Sespie | expr '&' expr { $$ = $1 & $3; } 7168d37339Sespie | expr '^' expr { $$ = $1 ^ $3; } 7268d37339Sespie | expr '|' expr { $$ = $1 | $3; } 7368d37339Sespie | expr LAND expr { $$ = $1 && $3; } 7468d37339Sespie | expr LOR expr { $$ = $1 || $3; } 7568d37339Sespie | '(' expr ')' { $$ = $2; } 7668d37339Sespie | '-' expr %prec UMINUS { $$ = -$2; } 7768d37339Sespie | '+' expr %prec UPLUS { $$ = $2; } 7868d37339Sespie | '!' expr { $$ = !$2; } 7968d37339Sespie | '~' expr { $$ = ~$2; } 8068d37339Sespie | NUMBER 8168d37339Sespie ; 8268d37339Sespie %% 8368d37339Sespie 84