calclex.l
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:3k
源码类别:

数学计算

开发平台:

Unix_Linux

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