From 11da511c784eca003deb90c23570f0873954e0de Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Sat, 18 Nov 2023 06:11:09 -0600 Subject: Initial commit. --- gmp-6.3.0/demos/calc/calclex.l | 113 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 gmp-6.3.0/demos/calc/calclex.l (limited to 'gmp-6.3.0/demos/calc/calclex.l') diff --git a/gmp-6.3.0/demos/calc/calclex.l b/gmp-6.3.0/demos/calc/calclex.l new file mode 100644 index 0000000..44df848 --- /dev/null +++ b/gmp-6.3.0/demos/calc/calclex.l @@ -0,0 +1,113 @@ +/* Lexical analyzer for calc program. + +Copyright 2000-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 3 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, see https://www.gnu.org/licenses/. */ + +%{ +#include +#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; +} -- cgit v1.2.3