github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/demos/calc/calclex.l (about)

     1  /* Lexical analyzer for calc program.
     2  
     3  Copyright 2000-2002 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 3 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, 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.  */
    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  }