X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginsh%2Fginsh_lexer.ll;h=20cb329776d26d7dd92033f4a9bcaad12a8305bb;hp=b282f836ab0a7c93615e7000a0771f06c1bdad71;hb=0f4889513f4f70809d64a608e6fa0ec5cdb83390;hpb=6b3768e8c544739ae53321539cb4d1e3112ded1b diff --git a/ginsh/ginsh_lexer.ll b/ginsh/ginsh_lexer.ll index b282f836..20cb3297 100644 --- a/ginsh/ginsh_lexer.ll +++ b/ginsh/ginsh_lexer.ll @@ -1,7 +1,24 @@ +/** @file ginsh_lexer.ll + * + * Lexical analyzer definition for ginsh. + * This file must be processed with flex. */ + /* - * ginsh.l - GiNaC Interactive Shell, lexical analyzer definition + * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany + * + * 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. * - * This file must be processed with flex + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ @@ -12,16 +29,7 @@ %{ #include "config.h" -#include -extern "C" { -#include -#include -} -#include - -#include #include "ginsh.h" - #include "ginsh_parser.h" #define YY_INPUT(buf, result, max_size) (result = ginsh_input(buf, max_size)) @@ -47,12 +55,13 @@ AN [0-9a-zA-Z_] %% [ \t\n]+ /* skip whitespace */ \\$ /* skip line continuations */ -"#".* /* skip comments starting with "#" */ +"//".* /* skip comments starting with "//" */ +^"#".* /* skip lines starting with "#" */ ^"!".* system(yytext + 1); /* execute shell command */ /* special values */ Pi yylval = Pi; return T_LITERAL; -EulerGamma yylval = EulerGamma; return T_LITERAL; +Euler yylval = Euler; return T_LITERAL; Catalan yylval = Catalan; return T_LITERAL; FAIL yylval = *new fail(); return T_LITERAL; I yylval = I; return T_NUMBER; @@ -60,7 +69,9 @@ Digits yylval = (long)Digits; return T_DIGITS; /* keywords */ quit|exit return T_QUIT; +warranty return T_WARRANTY; print return T_PRINT; +iprint return T_IPRINT; time return T_TIME; xyzzy return T_XYZZY; inventory return T_INVENTORY; @@ -84,15 +95,21 @@ score return T_SCORE; /* numbers */ {D}+ | +"#"{D}+"R"{AN}+ | +"#b"([01])+ | +"#o"[0-7]+ | +"#x"[0-9a-fA-F]+ | {D}+"."{D}*({E})? | {D}*"."{D}+({E})? | {D}+{E} yylval = numeric(yytext); return T_NUMBER; /* symbols */ {A}{AN}* { - if (syms.find(yytext) == syms.end()) - syms[yytext] = *(new symbol(yytext)); - yylval = syms[yytext]; + sym_tab::const_iterator i = syms.find(yytext); + if (i == syms.end()) { + yylval = syms[yytext] = *(new symbol(yytext)); + } else + yylval = i->second; return T_SYMBOL; } @@ -115,9 +132,9 @@ static int ginsh_input(char *buf, int max_size) { int result; if (yy_current_buffer->yy_is_interactive) { - int actual; - +#ifdef HAVE_LIBREADLINE // Do we need to read a new line? + int actual; if (line_length == 0) { // Free old line @@ -148,15 +165,44 @@ static int ginsh_input(char *buf, int max_size) line_length -= actual; line_ptr += actual; result = actual; - +#else + printf("> "); fflush(stdout); + int c = '*', n; + for (n = 0; n < max_size && (c = getc(yyin)) != EOF && c != '\n'; ++n) + buf[n] = (char)c; + if (c == '\n') + buf[n++] = (char)c; + if (c == EOF && ferror(yyin)) + YY_FATAL_ERROR("input in flex scanner failed"); + result = n; +#endif } else if (((result = fread(buf, 1, max_size, yyin)) == 0) && ferror(yyin)) YY_FATAL_ERROR("input in flex scanner failed"); return result; } -// Scanner terminates on EOF +// List of input files to be processed +int num_files = 0; +char **file_list = NULL; + +// EOF encountered, connect to next file. If this was the last file, +// connect to stdin. If this was stdin, terminate the scanner. int yywrap() { - return 1; + if (yyin == stdin) + return 1; + + fclose(yyin); + if (num_files) { + yyin = fopen(*file_list, "r"); + if (yyin == NULL) { + cerr << "Can't open " << *file_list << endl; + return 1; + } + num_files--; + file_list++; + } else + yyin = stdin; + return 0; }