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