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