]> CyberLeo.Net >> Repos - FreeBSD/stable/8.git/blob - bin/sh/arith_lex.l
MFC r294102:
[FreeBSD/stable/8.git] / bin / sh / arith_lex.l
1 %{
2 /*-
3  * Copyright (c) 1993
4  *      The Regents of the University of California.  All rights reserved.
5  *
6  * This code is derived from software contributed to Berkeley by
7  * Kenneth Almquist.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #if 0
35 #ifndef lint
36 static char sccsid[] = "@(#)arith_lex.l 8.3 (Berkeley) 5/4/95";
37 #endif
38 #endif /* not lint */
39
40 #include <sys/cdefs.h>
41 __FBSDID("$FreeBSD$");
42
43 #include <string.h>
44
45 #include "arith.h"
46 #include "shell.h"
47 #include "y.tab.h"
48 #include "error.h"
49 #include "memalloc.h"
50 #include "var.h"
51
52 int yylex(void);
53
54 struct varname
55 {
56         struct varname *next;
57         char name[1];
58 };
59 static struct varname *varnames;
60
61 #undef YY_INPUT
62 #define YY_INPUT(buf,result,max) \
63         do { \
64                 result = strnlen(arith_buf, max); \
65                 if (result == 0) \
66                         result = YY_NULL; \
67                 else { \
68                         memcpy(buf, arith_buf, result); \
69                         arith_buf += result; \
70                 } \
71         } while (0);
72 #define YY_NO_UNPUT
73 %}
74
75 %%
76 [ \t\n] { ; }
77
78 0x[a-fA-F0-9]+  {
79                         yylval.l_value = strtoarith_t(yytext, NULL, 16);
80                         return ARITH_NUM;
81                 }
82
83 0[0-7]+         {
84                         yylval.l_value = strtoarith_t(yytext, NULL, 8);
85                         return ARITH_NUM;
86                 }
87
88 [0-9]+          {
89                         yylval.l_value = strtoarith_t(yytext, NULL, 10);
90                         return ARITH_NUM;
91                 }
92
93 [A-Za-z_][A-Za-z0-9_]*  {
94                         /*
95                          * If variable doesn't exist, we should initialize
96                          * it to zero.
97                          */
98                         struct varname *temp;
99                         if (lookupvar(yytext) == NULL)
100                                 setvarsafe(yytext, "0", 0);
101                         temp = ckmalloc(sizeof(struct varname) +
102                             strlen(yytext));
103                         temp->next = varnames;
104                         varnames = temp;
105                         yylval.s_value = strcpy(temp->name, yytext);
106
107                         return ARITH_VAR;
108                 }
109
110 "("             {       return ARITH_LPAREN;    }
111 ")"             {       return ARITH_RPAREN;    }
112 "||"            {       return ARITH_OR;        }
113 "&&"            {       return ARITH_AND;       }
114 "|"             {       return ARITH_BOR;       }
115 "^"             {       return ARITH_BXOR;      }
116 "&"             {       return ARITH_BAND;      }
117 "=="            {       return ARITH_EQ;        }
118 "!="            {       return ARITH_NE;        }
119 ">"             {       return ARITH_GT;        }
120 ">="            {       return ARITH_GE;        }
121 "<"             {       return ARITH_LT;        }
122 "<="            {       return ARITH_LE;        }
123 "<<"            {       return ARITH_LSHIFT;    }
124 ">>"            {       return ARITH_RSHIFT;    }
125 "*"             {       return ARITH_MUL;       }
126 "/"             {       return ARITH_DIV;       }
127 "%"             {       return ARITH_REM;       }
128 "+"             {       return ARITH_ADD;       }
129 "-"             {       return ARITH_SUB;       }
130 "~"             {       return ARITH_BNOT;      }
131 "!"             {       return ARITH_NOT;       }
132 "="             {       return ARITH_ASSIGN;    }
133 "+="            {       return ARITH_ADDASSIGN; }
134 "-="            {       return ARITH_SUBASSIGN; }
135 "*="            {       return ARITH_MULASSIGN; }
136 "/="            {       return ARITH_DIVASSIGN; }
137 "%="            {       return ARITH_REMASSIGN; }
138 ">>="           {       return ARITH_RSHASSIGN; }
139 "<<="           {       return ARITH_LSHASSIGN; }
140 "&="            {       return ARITH_BANDASSIGN; }
141 "^="            {       return ARITH_BXORASSIGN; }
142 "|="            {       return ARITH_BORASSIGN; }
143 .               {
144                         error("arith: syntax error: \"%s\"\n", arith_startbuf);
145                 }
146 %%
147
148 void
149 arith_lex_reset(void)
150 {
151         struct varname *name, *next;
152
153         YY_NEW_FILE;
154
155         name = varnames;
156         while (name != NULL) {
157                 next = name->next;
158                 ckfree(name);
159                 name = next;
160         }
161         varnames = NULL;
162 }