source: git/Singular/scanner.l @ cc94b0a

spielwiese
Last change on this file since cc94b0a was cc94b0a, checked in by Hans Schönemann <hannes@…>, 26 years ago
Tue Mar 31 10:47:06 MET DST 1998 hannes * feread.cc: fixed handling of empty history * clapsing.cc: fixed gcd(0,..) and gcd(..,0) -> pOne() * febase.h/febase.inc: renaming of scanner variables ( yy_blocklineno, yy_noeof) * febase.inc: increased speed in feReadLine * minor changes in scanner/grammar/iparith.cc (example) git-svn-id: file:///usr/local/Singular/svn/trunk@1291 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 11.9 KB
Line 
1%{
2/****************************************
3*  Computer Algebra System SINGULAR     *
4****************************************/
5/* $Id: scanner.l,v 1.10 1998-03-31 09:00:44 Singular Exp $ */
6#include <stdio.h>
7#include <string.h>
8#include <stdlib.h>
9#include <ctype.h>
10
11#include "mod2.h"
12#include "tok.h"
13#include "stype.h"
14#include "ipshell.h"
15#include "mmemory.h"
16#include "febase.h"
17
18int feReadLine(char* b, int l);
19#define ALLOC(a) Alloc((a))
20int yylineno  = 0;
21static int blocknest = 0;
22extern char * yytext;
23//extern unsigned char * yytext;
24extern int yyleng;
25extern BOOLEAN noringvars;
26extern int inerror;
27
28static char * dupyytext()
29{
30  //int i = strlen((char *)yytext);
31  //if (i>0) yytext[i-1] = '\0';
32  if (yyleng>0) yytext[yyleng-1] = '\0';
33  return mstrdup((char *)yytext);
34}
35
36static char * dupyytextNL()
37{
38  int i = yyleng;//strlen((char *)yytext);
39  char * rc = (char*)AllocL( 3 + i );
40  if (i>0)
41  {
42    yytext[i-1] = '\0';
43    strcpy( rc, (char *)yytext );
44  }
45  else
46    i++;
47  rc[i-1] = '\n';
48  rc[i] = '\n';
49  rc[i+1] = '\0';
50  return rc;
51}
52
53  #undef YY_DECL
54  #define YY_DECL int yylex(YYSTYPE* lvalp)
55
56  #undef yywrap
57  extern "C" {
58  int yywrap() { return exitVoice(); }
59  }
60
61  #undef YY_INPUT
62  #define YY_INPUT(buf,result,max_size) \
63          result = feReadLine( (char *) (buf), (max_size) )
64
65  #undef YY_USER_ACTION
66  #define YY_USER_ACTION \
67          if ((inerror==1)&&(*yytext>=' '))\
68          { Print("   skipping text from `%s`",yytext);inerror=2; }
69
70%}
71
72digit          [0-9]
73letter         [@a-zA-Z\']
74integer        {digit}+
75monom          {letter}+{digit}*
76rgvars         ({digit}+[/])*{digit}+{monom}+
77realnum        {digit}+"."{digit}+("e"[+-]{digit}+)?
78name           ({letter}({letter}*{digit}*_*)*|_)
79parname        #
80
81/* %start START */
82
83%x string
84%x block
85%x blockstr
86%x brace
87%x bracestr
88%x bracket
89%x asstring
90
91%%
92\/\/[^\n]*               { }
93^#![^\n]*                { }
94pause[ \t\n]*[\.;]       { fePause(); }
95while                    { blocknest = 0; yy_noeof = noeof_brace; BEGIN(brace);
96                           return WHILE_CMD;}
97for                      { blocknest = 0; yy_noeof = noeof_brace; BEGIN(brace);
98                           return FOR_CMD;}
99
100("help"|"?")[ \t\n]*     { yy_noeof = noeof_asstring;
101                           BEGIN(asstring);
102                           return HELP_CMD;
103                         }
104
105proc[ \t]+{name}[ \t]*\( {
106                           char c; char *cp;
107                           lvalp->name = mstrdup(iiProcName((char *)yytext,c,cp));
108                           yy_noeof = noeof_procname;
109                           blocknest = 1;
110                           BEGIN(brace);
111                           return PROC_DEF;
112                         }
113<asstring>[^;\n]+        {
114                           lvalp->name = mstrdup((char *)yytext);
115                           yy_noeof = 0; BEGIN(INITIAL);
116                           return STRINGTOK;
117                         }
118<asstring>;              {
119                           yy_noeof = 0; BEGIN(INITIAL);
120                           return *yytext;
121                         }
122
123<brace>"\""              {
124                           yy_noeof = noeof_string;
125                           BEGIN(bracestr);
126                           yymore();
127                         }
128<brace>"("               { if (blocknest++) yymore(); }
129<brace>[^;\(\)]          { if (blocknest) yymore(); }
130<brace>";"               {
131                           if (blocknest)
132                           {
133                             lvalp->name = dupyytext();
134                             return STRINGTOK;
135                           }
136                         }
137<brace>")"               {
138                           if (--blocknest <= 0)
139                           {
140                             yy_noeof = 0;
141                             BEGIN(INITIAL);
142                             lvalp->name = dupyytext();
143                             return STRINGTOK;
144                           }
145                           yymore();
146                         }
147<bracestr>"\""           {
148                           yy_noeof = noeof_brace;
149                           BEGIN(brace);
150                           yymore();
151                         }
152<bracestr>[^\"]          { yymore(); }
153<bracket>"("             { return '('; }
154<bracket>","             { return ','; }
155<bracket>[ \t\n]*        { ; }
156<bracket>[^\(\), \t\n]*  {
157                           lvalp->name = mstrdup((char *)yytext);
158                           return STRINGTOK;
159                         }
160<bracket>\"[^\"]*\"      {
161                           lvalp->name = mstrdup((char *)yytext);
162                           return STRINGTOK;
163                         }
164<bracket>")"             {
165                           yy_noeof = 0; BEGIN(INITIAL);
166                           return ')';
167                         }
168
169"{"                      {
170                           yy_blocklineno = yylineno;
171                           blocknest = 1;
172                           yy_noeof = noeof_block;
173                           BEGIN(block);
174                         }
175<block>"\""              {
176                           yy_noeof = noeof_string;
177                           BEGIN(blockstr);
178                           yymore();
179                         }
180<blockstr>[^\"]          { yymore(); }
181<blockstr>"\\\\"         { yymore(); }
182<blockstr>"\\\""         { yymore(); }
183<blockstr>"\""           {
184                           yy_noeof = noeof_block;
185                           BEGIN(block);
186                           yymore();
187                         }
188<block>[^\{\}\"]*        { yymore(); }
189<block>"{"               { blocknest++; yymore(); }
190<block>"}"               {
191                           if (--blocknest <= 0)
192                           {
193                             BEGIN(INITIAL);
194                             yy_noeof = 0;
195                             lvalp->name = dupyytextNL();
196                             return BLOCKTOK;
197                           }
198                           yymore();
199                         }
200"\""                     { BEGIN(string); yy_noeof = noeof_string;}
201~                        { return SYS_BREAK; }
202<string>[^\"]            { yymore(); }
203<string>"\\\\"           { yymore(); }
204<string>"\\\""           { yymore(); }
205<string>"\""             {
206                           char * s;
207                           yy_noeof = 0;
208                           BEGIN(INITIAL);
209                           s = lvalp->name = dupyytext();
210                           while (*yytext)
211                           {
212                             if (*yytext == '\\') yytext++;
213                             *s++ = *yytext++;
214                           }
215                           *s++ = *yytext++;
216                           return STRINGTOK;
217                         }
218
219[ \t\r\n]                /* skip whitespace */
220".."                     { return DOTDOT; }
221"::"                     { return COLONCOLON; }
222"--"                     { return MINUSMINUS; }
223"++"                     { return PLUSPLUS  ; }
224"=="                     { return EQUAL_EQUAL; }
225"&&"                     { return '&'; }
226"||"                     { return '|'; }
227"<="                     { return LE; }
228">="                     { return GE; }
229"!"                      { return NOT; }
230"!="                     { return NOTEQUAL; }
231"<>"                     { return NOTEQUAL; }
232"**"                     { return '^'; }
233\\                       { return '\\'; }
234newline                  {
235                           lvalp->name = mstrdup("\n");
236                           return STRINGTOK;
237                         }
238{integer}                {
239                           lvalp->name = (char *)yytext;
240                           if ((currRing!=NULL)
241                           && (strlen(lvalp->name)>MAX_INT_LEN))
242                           {
243                             lvalp->name = mstrdup((char *)yytext);
244                             return RINGVAR;
245                           }
246                           else
247                             return INT_CONST;
248                         }
249{integer}\/{integer}     {
250                           lvalp->name = mstrdup((char *)yytext);
251                           return RINGVAR;
252                         }
253\$                       {
254                           #ifdef HAVE_TCL
255                           if (tclmode)
256                             PrintTCL('Q',0,NULL);
257                           else
258                           #endif
259                           { if (BVERBOSE(0)) printf("\n$Bye.\n"); }
260                           #ifndef macintosh
261                             #ifdef HAVE_FEREAD
262                               #ifdef HAVE_ATEXIT
263                                 fe_reset_input_mode();
264                               #else
265                                 fe_reset_input_mode(0,NULL);
266                               #endif
267                             #else
268                               #ifdef HAVE_READLINE
269                                 fe_reset_input_mode();
270                               #endif
271                             #endif
272                           #endif
273                           #ifdef sun
274                           #ifndef __svr4__
275                           _cleanup();
276                           _exit(0);
277                           #endif
278                           #endif
279                           exit(0);
280                         }
281(quit|exit)[ \t\n]*[\.;]?  {
282                           #ifdef HAVE_TCL
283                             if (tclmode)
284                               PrintTCL('Q',0,NULL);
285                             else
286                           #endif
287                           #ifdef MM_STAT
288                           mmStat(-500);
289                           #endif
290                           { if (BVERBOSE(0)) printf("\nAuf Wiedersehen.\n"); }
291                           #ifndef macintosh
292                             #ifdef HAVE_FEREAD
293                               #ifdef HAVE_ATEXIT
294                                 fe_reset_input_mode();
295                               #else
296                                 fe_reset_input_mode(0,NULL);
297                               #endif
298                             #else
299                               #ifdef HAVE_READLINE
300                                 fe_reset_input_mode();
301                               #endif
302                             #endif
303                           #endif
304                           #ifdef MDEBUG
305                             #ifdef MLIST
306                             mmTestList();
307                             #endif
308                           #endif
309                           #ifdef sun
310                           #ifndef __svr4__
311                           _cleanup();
312                           _exit(0);
313                           #endif
314                           #endif
315                           exit(0);
316                         }
317
318{rgvars}|{realnum}       {
319                           lvalp->name = mstrdup((char *)yytext);
320                           return RINGVAR;
321                         }
322
323({parname}|{name})       {
324                           /* {name} */
325                           int rc=0;
326                           if (yytext[strlen((char *)yytext)-1] == '\n')
327                           {
328                             yytext[strlen((char *)yytext)-1] = '\0';
329                           }
330                           if (yyleng > 1)
331                           {
332                             rc = IsCmd((char *)yytext,lvalp->i);
333                             if (rc) return rc;
334                           }
335                           lvalp->name = mstrdup((char *)yytext);
336                           return UNKNOWN_IDENT;
337                         }
338
339.                       {
340                           /*if (*yytext == '\n') REJECT;*/
341                           lvalp->i = *yytext;   /* token has own value */
342                           return *yytext;
343                         }
344%%
345
346void * myynewbuffer()
347{
348  void * oldb = yy_current_buffer;
349  yy_switch_to_buffer(yy_create_buffer(NULL, YY_BUF_SIZE));
350  return oldb;
351}
352
353void myyoldbuffer(void * oldb)
354{
355  yy_delete_buffer(yy_current_buffer);
356  yy_switch_to_buffer((YY_BUFFER_STATE)oldb);
357  //yy_flush_buffer((YY_BUFFER_STATE)oldb);
358}
Note: See TracBrowser for help on using the repository browser.