115 lines
2.9 KiB
Plaintext
115 lines
2.9 KiB
Plaintext
|
/* Lexical analyzer for calc program.
|
||
|
|
||
|
Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||
|
|
||
|
This file is part of the GNU MP Library.
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify it under
|
||
|
the terms of the GNU General Public License as published by the Free Software
|
||
|
Foundation; either version 2 of the License, or (at your option) any later
|
||
|
version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||
|
PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License along with
|
||
|
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
|
||
|
Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||
|
|
||
|
%{
|
||
|
#include <string.h>
|
||
|
#include "calc-common.h"
|
||
|
|
||
|
|
||
|
#if WITH_READLINE
|
||
|
/* Let GNU flex use readline. See the calcread.c redefined input() for a
|
||
|
way that might work for a standard lex too. */
|
||
|
#define YY_INPUT(buf,result,max_size) \
|
||
|
result = calc_input (buf, max_size);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* Non-zero when reading the second or subsequent line of an expression,
|
||
|
used to give a different prompt when using readline. */
|
||
|
int calc_more_input = 0;
|
||
|
|
||
|
|
||
|
const struct calc_keywords_t calc_keywords[] = {
|
||
|
{ "abs", ABS },
|
||
|
{ "bin", BIN },
|
||
|
{ "decimal", DECIMAL },
|
||
|
{ "fib", FIB },
|
||
|
{ "hex", HEX },
|
||
|
{ "help", HELP },
|
||
|
{ "gcd", GCD },
|
||
|
{ "kron", KRON },
|
||
|
{ "lcm", LCM },
|
||
|
{ "lucnum", LUCNUM },
|
||
|
{ "nextprime", NEXTPRIME },
|
||
|
{ "powm", POWM },
|
||
|
{ "quit", QUIT },
|
||
|
{ "root", ROOT },
|
||
|
{ "sqrt", SQRT },
|
||
|
{ NULL }
|
||
|
};
|
||
|
%}
|
||
|
|
||
|
%%
|
||
|
|
||
|
[ \t\f] { /* white space is skipped */ }
|
||
|
|
||
|
[;\n] { /* semicolon or newline separates statements */
|
||
|
calc_more_input = 0;
|
||
|
return EOS; }
|
||
|
\\\n { /* escaped newlines are skipped */ }
|
||
|
|
||
|
|
||
|
#(([^\\\n]*)\\)+\n {
|
||
|
/* comment through to escaped newline is skipped */ }
|
||
|
#[^\n]*\n { /* comment through to newline is a separator */
|
||
|
calc_more_input = 0;
|
||
|
return EOS; }
|
||
|
#[^\n]* { /* comment through to EOF skipped */ }
|
||
|
|
||
|
|
||
|
[-+*/%()<>^!=,] { return yytext[0]; }
|
||
|
"<=" { return LE; }
|
||
|
">=" { return GE; }
|
||
|
"==" { return EQ; }
|
||
|
"!=" { return NE; }
|
||
|
"<<" { return LSHIFT; }
|
||
|
">>" { return RSHIFT; }
|
||
|
"&&" { return LAND; }
|
||
|
"||" { return LOR; }
|
||
|
|
||
|
(0[xX])?[0-9A-F]+ {
|
||
|
yylval.str = yytext;
|
||
|
return NUMBER; }
|
||
|
|
||
|
[a-zA-Z][a-zA-Z0-9]* {
|
||
|
int i;
|
||
|
|
||
|
for (i = 0; calc_keywords[i].name != NULL; i++)
|
||
|
if (strcmp (yytext, calc_keywords[i].name) == 0)
|
||
|
return calc_keywords[i].value;
|
||
|
|
||
|
if (yytext[0] >= 'a' && yytext[0] <= 'z' && yytext[1] == '\0')
|
||
|
{
|
||
|
yylval.var = yytext[0] - 'a';
|
||
|
return VARIABLE;
|
||
|
}
|
||
|
|
||
|
return BAD;
|
||
|
}
|
||
|
|
||
|
. { return BAD; }
|
||
|
|
||
|
%%
|
||
|
|
||
|
int
|
||
|
yywrap ()
|
||
|
{
|
||
|
return 1;
|
||
|
}
|