1/* Lexical analyzer for calc program.
2
3Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library.
6
7This program is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free Software
9Foundation; either version 3 of the License, or (at your option) any later
10version.
11
12This program is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License along with
17this program.  If not, see http://www.gnu.org/licenses/.  */
18
19%{
20#include <string.h>
21#include "calc-common.h"
22
23
24#if WITH_READLINE
25/* Let GNU flex use readline.  See the calcread.c redefined input() for a
26   way that might work for a standard lex too.  */
27#define YY_INPUT(buf,result,max_size)   \
28  result = calc_input (buf, max_size);
29#endif
30
31
32/* Non-zero when reading the second or subsequent line of an expression,
33   used to give a different prompt when using readline.  */
34int  calc_more_input = 0;
35
36
37const struct calc_keywords_t  calc_keywords[] = {
38  { "abs",       ABS },
39  { "bin",       BIN },
40  { "decimal",   DECIMAL },
41  { "fib",       FIB },
42  { "hex",       HEX },
43  { "help",      HELP },
44  { "gcd",       GCD },
45  { "kron",      KRON },
46  { "lcm",       LCM },
47  { "lucnum",    LUCNUM },
48  { "nextprime", NEXTPRIME },
49  { "powm",      POWM },
50  { "quit",      QUIT },
51  { "root",      ROOT },
52  { "sqrt",      SQRT },
53  { NULL }
54};
55%}
56
57%%
58
59[ \t\f] { /* white space is skipped */ }
60
61[;\n]   { /* semicolon or newline separates statements */
62          calc_more_input = 0;
63          return EOS; }
64\\\n    { /* escaped newlines are skipped */ }
65
66
67#(([^\\\n]*)\\)+\n {
68            /* comment through to escaped newline is skipped */ }
69#[^\n]*\n { /* comment through to newline is a separator */
70            calc_more_input = 0;
71            return EOS; }
72#[^\n]* {   /* comment through to EOF skipped */ }
73
74
75[-+*/%()<>^!=,] { return yytext[0]; }
76"<="    { return LE; }
77">="    { return GE; }
78"=="    { return EQ; }
79"!="    { return NE; }
80"<<"    { return LSHIFT; }
81">>"    { return RSHIFT; }
82"&&"    { return LAND; }
83"||"    { return LOR; }
84
85(0[xX])?[0-9A-F]+ {
86        yylval.str = yytext;
87        return NUMBER; }
88
89[a-zA-Z][a-zA-Z0-9]* {
90        int  i;
91
92        for (i = 0; calc_keywords[i].name != NULL; i++)
93          if (strcmp (yytext, calc_keywords[i].name) == 0)
94            return calc_keywords[i].value;
95
96        if (yytext[0] >= 'a' && yytext[0] <= 'z' && yytext[1] == '\0')
97          {
98            yylval.var = yytext[0] - 'a';
99            return VARIABLE;
100          }
101
102        return BAD;
103}
104
105. { return BAD; }
106
107%%
108
109int
110yywrap ()
111{
112  return 1;
113}
114