kmkbuiltin/expr.c: file revision 1.17 from OpenBSD
[kbuild-mirror.git] / src / ash / arith_lex.l
blob550249204871e04ddacb112a1af4bc2a1fc5bb96
1 %option noyywrap
2 %{
3 /*      $NetBSD: arith_lex.l,v 1.13 2005/03/21 22:37:09 dsl Exp $       */
5 /*-
6  * Copyright (c) 1993
7  *      The Regents of the University of California.  All rights reserved.
8  *
9  * This code is derived from software contributed to Berkeley by
10  * Kenneth Almquist.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  */
37 #ifdef HAVE_SYS_CDEFS_H
38 #include <sys/cdefs.h>
39 #endif
40 #ifndef lint
41 #if 0
42 static char sccsid[] = "@(#)arith_lex.l 8.3 (Berkeley) 5/4/95";
43 #else
44 __RCSID("$NetBSD: arith_lex.l,v 1.13 2005/03/21 22:37:09 dsl Exp $");
45 #endif
46 #endif /* not lint */
48 #include <unistd.h>
49 #include "arith.h"
50 #include "error.h"
51 #include "expand.h"
52 #include "var.h"
54 extern int yylval;
55 extern char *arith_buf, *arith_startbuf;
56 #undef YY_INPUT
57 #define YY_INPUT(buf,result,max) \
58         result = (*buf = *arith_buf++) ? 1 : YY_NULL;
59 #define YY_NO_UNPUT
63 [ \t\n] { ; }
64 0x[0-9a-fA-F]+  { yylval = strtol(yytext, 0, 0); return(ARITH_NUM); }
65 0[0-7]*         { yylval = strtol(yytext, 0, 0); return(ARITH_NUM); }
66 [1-9][0-9]*     { yylval = strtol(yytext, 0, 0); return(ARITH_NUM); }
67 [A-Za-z_][A-Za-z_0-9]*  { char *v = lookupvar(yytext);
68                         if (v) {
69                                 yylval = strtol(v, &v, 0);
70                                 if (*v == 0)
71                                         return ARITH_NUM;
72                         }
73                         error("arith: syntax error: \"%s\"", arith_startbuf);
74                 }
75 "("     { return(ARITH_LPAREN); }
76 ")"     { return(ARITH_RPAREN); }
77 "||"    { return(ARITH_OR); }
78 "&&"    { return(ARITH_AND); }
79 "|"     { return(ARITH_BOR); }
80 "^"     { return(ARITH_BXOR); }
81 "&"     { return(ARITH_BAND); }
82 "=="    { return(ARITH_EQ); }
83 "!="    { return(ARITH_NE); }
84 ">"     { return(ARITH_GT); }
85 ">="    { return(ARITH_GE); }
86 "<"     { return(ARITH_LT); }
87 "<="    { return(ARITH_LE); }
88 "<<"    { return(ARITH_LSHIFT); }
89 ">>"    { return(ARITH_RSHIFT); }
90 "*"     { return(ARITH_MUL); }
91 "/"     { return(ARITH_DIV); }
92 "%"     { return(ARITH_REM); }
93 "+"     { return(ARITH_ADD); }
94 "-"     { return(ARITH_SUB); }
95 "~"     { return(ARITH_BNOT); }
96 "!"     { return(ARITH_NOT); }
97 .       { error("arith: syntax error: \"%s\"", arith_startbuf); }
100 void
101 arith_lex_reset() {
102 #ifdef YY_NEW_FILE
103         YY_NEW_FILE;
104 #endif