Annotation of src/usr.bin/m4/parser.y, Revision 1.6
1.1 espie 1: %{
1.6 ! espie 2: /* $OpenBSD: parser.y,v 1.5 2008/08/16 12:23:50 espie 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
1.6 ! espie 25: %token ERROR
1.1 espie 26: %left LOR
27: %left LAND
28: %left '|'
29: %left '^'
30: %left '&'
31: %left EQ NE
32: %left '<' LE '>' GE
33: %left LSHIFT RSHIFT
34: %left '+' '-'
35: %left '*' '/' '%'
36: %right UMINUS UPLUS '!' '~'
37:
38: %%
39:
40: top : expr { end_result = $1; }
41: ;
42: expr : expr '+' expr { $$ = $1 + $3; }
43: | expr '-' expr { $$ = $1 - $3; }
44: | expr '*' expr { $$ = $1 * $3; }
1.2 otto 45: | expr '/' expr {
46: if ($3 == 0) {
47: yyerror("division by zero");
48: exit(1);
49: }
50: $$ = $1 / $3;
51: }
52: | expr '%' expr {
53: if ($3 == 0) {
54: yyerror("modulo zero");
55: exit(1);
56: }
57: $$ = $1 % $3;
58: }
1.1 espie 59: | expr LSHIFT expr { $$ = $1 << $3; }
60: | expr RSHIFT expr { $$ = $1 >> $3; }
61: | expr '<' expr { $$ = $1 < $3; }
62: | expr '>' expr { $$ = $1 > $3; }
63: | expr LE expr { $$ = $1 <= $3; }
64: | expr GE expr { $$ = $1 >= $3; }
65: | expr EQ expr { $$ = $1 == $3; }
66: | expr NE expr { $$ = $1 != $3; }
67: | expr '&' expr { $$ = $1 & $3; }
68: | expr '^' expr { $$ = $1 ^ $3; }
69: | expr '|' expr { $$ = $1 | $3; }
70: | expr LAND expr { $$ = $1 && $3; }
71: | expr LOR expr { $$ = $1 || $3; }
72: | '(' expr ')' { $$ = $2; }
73: | '-' expr %prec UMINUS { $$ = -$2; }
74: | '+' expr %prec UPLUS { $$ = $2; }
75: | '!' expr { $$ = !$2; }
76: | '~' expr { $$ = ~$2; }
77: | NUMBER
78: ;
79: %%
80: