xref: /minix3/usr.bin/m4/parser.y (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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