12e8d1edaSArun Thomas %{ 2*0a6a1f1dSLionel Sambuc /* $NetBSD: parser.y,v 1.3 2015/01/04 18:31:09 joerg Exp $ */ 32e8d1edaSArun Thomas /* $OpenBSD: parser.y,v 1.6 2008/08/21 21:00:14 espie Exp $ */ 42e8d1edaSArun Thomas /* 52e8d1edaSArun Thomas * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org> 62e8d1edaSArun Thomas * 72e8d1edaSArun Thomas * Permission to use, copy, modify, and distribute this software for any 82e8d1edaSArun Thomas * purpose with or without fee is hereby granted, provided that the above 92e8d1edaSArun Thomas * copyright notice and this permission notice appear in all copies. 102e8d1edaSArun Thomas * 112e8d1edaSArun Thomas * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 122e8d1edaSArun Thomas * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 132e8d1edaSArun Thomas * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 142e8d1edaSArun Thomas * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 152e8d1edaSArun Thomas * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 162e8d1edaSArun Thomas * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 172e8d1edaSArun Thomas * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 182e8d1edaSArun Thomas */ 192e8d1edaSArun Thomas #if HAVE_NBTOOL_CONFIG_H 202e8d1edaSArun Thomas #include "nbtool_config.h" 212e8d1edaSArun Thomas #endif 22*0a6a1f1dSLionel Sambuc #include <sys/cdefs.h> 23*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: parser.y,v 1.3 2015/01/04 18:31:09 joerg Exp $"); 242e8d1edaSArun Thomas #include <stdint.h> 252e8d1edaSArun Thomas #define YYSTYPE int32_t 262e8d1edaSArun Thomas extern int32_t end_result; 272e8d1edaSArun Thomas extern int yylex(void); 282e8d1edaSArun Thomas extern int yyerror(const char *); 292e8d1edaSArun Thomas %} 302e8d1edaSArun Thomas %token NUMBER 312e8d1edaSArun Thomas %token ERROR 322e8d1edaSArun Thomas %left LOR 332e8d1edaSArun Thomas %left LAND 342e8d1edaSArun Thomas %left '|' 352e8d1edaSArun Thomas %left '^' 362e8d1edaSArun Thomas %left '&' 372e8d1edaSArun Thomas %left EQ NE 382e8d1edaSArun Thomas %left '<' LE '>' GE 392e8d1edaSArun Thomas %left LSHIFT RSHIFT 402e8d1edaSArun Thomas %left '+' '-' 412e8d1edaSArun Thomas %left '*' '/' '%' 422e8d1edaSArun Thomas %right UMINUS UPLUS '!' '~' 432e8d1edaSArun Thomas 442e8d1edaSArun Thomas %% 452e8d1edaSArun Thomas 462e8d1edaSArun Thomas top : expr { end_result = $1; } 472e8d1edaSArun Thomas ; 482e8d1edaSArun Thomas expr : expr '+' expr { $$ = $1 + $3; } 492e8d1edaSArun Thomas | expr '-' expr { $$ = $1 - $3; } 502e8d1edaSArun Thomas | expr '*' expr { $$ = $1 * $3; } 512e8d1edaSArun Thomas | expr '/' expr { 522e8d1edaSArun Thomas if ($3 == 0) { 532e8d1edaSArun Thomas yyerror("division by zero"); 542e8d1edaSArun Thomas exit(1); 552e8d1edaSArun Thomas } 562e8d1edaSArun Thomas $$ = $1 / $3; 572e8d1edaSArun Thomas } 582e8d1edaSArun Thomas | expr '%' expr { 592e8d1edaSArun Thomas if ($3 == 0) { 602e8d1edaSArun Thomas yyerror("modulo zero"); 612e8d1edaSArun Thomas exit(1); 622e8d1edaSArun Thomas } 632e8d1edaSArun Thomas $$ = $1 % $3; 642e8d1edaSArun Thomas } 652e8d1edaSArun Thomas | expr LSHIFT expr { $$ = $1 << $3; } 662e8d1edaSArun Thomas | expr RSHIFT expr { $$ = $1 >> $3; } 672e8d1edaSArun Thomas | expr '<' expr { $$ = $1 < $3; } 682e8d1edaSArun Thomas | expr '>' expr { $$ = $1 > $3; } 692e8d1edaSArun Thomas | expr LE expr { $$ = $1 <= $3; } 702e8d1edaSArun Thomas | expr GE expr { $$ = $1 >= $3; } 712e8d1edaSArun Thomas | expr EQ expr { $$ = $1 == $3; } 722e8d1edaSArun Thomas | expr NE expr { $$ = $1 != $3; } 732e8d1edaSArun Thomas | expr '&' expr { $$ = $1 & $3; } 742e8d1edaSArun Thomas | expr '^' expr { $$ = $1 ^ $3; } 752e8d1edaSArun Thomas | expr '|' expr { $$ = $1 | $3; } 762e8d1edaSArun Thomas | expr LAND expr { $$ = $1 && $3; } 772e8d1edaSArun Thomas | expr LOR expr { $$ = $1 || $3; } 782e8d1edaSArun Thomas | '(' expr ')' { $$ = $2; } 792e8d1edaSArun Thomas | '-' expr %prec UMINUS { $$ = -$2; } 802e8d1edaSArun Thomas | '+' expr %prec UPLUS { $$ = $2; } 812e8d1edaSArun Thomas | '!' expr { $$ = !$2; } 822e8d1edaSArun Thomas | '~' expr { $$ = ~$2; } 832e8d1edaSArun Thomas | NUMBER 842e8d1edaSArun Thomas ; 852e8d1edaSArun Thomas %% 862e8d1edaSArun Thomas 87