blob: 44df848fadc118d606d87f44352e47e824569c52 [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001/* Lexical analyzer for calc program.
2
3Copyright 2000-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 https://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}