Annotation of OpenXM_contrib/gmp/demos/calc/calclex.l, Revision 1.1.1.1
1.1 ohara 1: /* Lexical analyzer for calc program.
2:
3: Copyright 2000, 2001 Free Software Foundation, Inc.
4:
5: This file is part of the GNU MP Library.
6:
7: This program is free software; you can redistribute it and/or modify it under
8: the terms of the GNU General Public License as published by the Free Software
9: Foundation; either version 2 of the License, or (at your option) any later
10: version.
11:
12: This program is distributed in the hope that it will be useful, but WITHOUT ANY
13: WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14: PARTICULAR PURPOSE. See the GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License along with
17: this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18: Place - Suite 330, Boston, MA 02111-1307, USA. */
19:
20: %{
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. */
34: int calc_more_input = 0;
35:
36:
37: const 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:
109: int
110: yywrap ()
111: {
112: return 1;
113: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>