source: git/Singular/scanner.l @ 917fb5

fieker-DuValspielwiese
Last change on this file since 917fb5 was 917fb5, checked in by Hans Schönemann <hannes@…>, 25 years ago
* hannes: removed pause; (scanner.l, febase.*) introduced pause([string]) (standard.lib) git-svn-id: file:///usr/local/Singular/svn/trunk@3237 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 10.7 KB
Line 
1%{
2/****************************************
3*  Computer Algebra System SINGULAR     *
4****************************************/
5/* $Id: scanner.l,v 1.17 1999-07-06 15:32: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;
21int 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  if (yyleng>0) yytext[yyleng-1] = '\0';
31  return mstrdup((char *)yytext);
32}
33
34static char * dupyytextNL()
35{
36  int i = yyleng;//strlen((char *)yytext);
37  char * rc = (char*)AllocL( 3 + i );
38  if (i>0)
39  {
40    strncpy( rc, (char *)yytext, i-1 );
41  }
42  else
43  {
44    i++;
45  }
46  rc[i-1] = '\n';
47  rc[i] = '\n';
48  rc[i+1] = '\0';
49  return rc;
50}
51
52  #undef YY_DECL
53  #define YY_DECL int yylex(YYSTYPE* lvalp)
54
55  #undef yywrap
56  extern "C" {
57  int yywrap() { return exitVoice(); }
58  }
59
60  #undef YY_INPUT
61  #define YY_INPUT(buf,result,max_size) \
62          result = feReadLine( (char *) (buf), (max_size) )
63
64  #undef YY_USER_ACTION
65  #define YY_USER_ACTION \
66          if ((inerror==1)&&(*yytext>=' '))\
67          { Print("   skipping text from `%s`",yytext);inerror=2; }
68
69%}
70
71digit          [0-9]
72letter         [@a-zA-Z\']
73integer        {digit}+
74monom          {letter}+{digit}*
75rgvars         ({digit}+[/])*{digit}+{monom}+
76realnum        {digit}+"."{digit}+("e"[+-]{digit}+)?
77name           ({letter}({letter}*{digit}*_*)*|_)
78parname        #
79
80/* %start START */
81%option always-interactive
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]*                { }
94"/*"                     {
95                           yy_noeof=noeof_comment;
96                           loop
97                           {
98                             register int c;
99                             while ( (c = yyinput()) != '*' && c != EOF );
100                             if ( c == '*' )
101                             {
102                               while ( (c = yyinput()) == '*' );
103                               if ( c == '/' ) break; /* found the end */
104                             }
105                             else
106                             {
107                               break;
108                             }
109                           }
110                           yy_noeof=0;
111                         }
112while                    { prompt_char='.';
113                           blocknest = 0; yy_noeof = noeof_brace; BEGIN(brace);
114                           return WHILE_CMD;}
115for                      { prompt_char='.';
116                           blocknest = 0; yy_noeof = noeof_brace; BEGIN(brace);
117                           return FOR_CMD;}
118
119("help"|"?")[ \t\n]*     { yy_noeof = noeof_asstring;
120                           BEGIN(asstring);
121                           return HELP_CMD;
122                         }
123
124proc[ \t]+{name}[ \t]*\( {
125                           char c; char *cp;
126                           lvalp->name = mstrdup(iiProcName((char *)yytext,c,cp));
127                           yy_noeof = noeof_procname;
128                           blocknest = 1;
129                           BEGIN(brace);
130                           return PROC_DEF;
131                         }
132<asstring>[^;\n]+        {
133                           lvalp->name = mstrdup((char *)yytext);
134                           yy_noeof = 0; BEGIN(INITIAL);
135                           return STRINGTOK;
136                         }
137<asstring>;              {
138                           yy_noeof = 0; BEGIN(INITIAL);
139                           return *yytext;
140                         }
141
142<brace>"\""              {
143                           yy_noeof = noeof_string;
144                           BEGIN(bracestr);
145                           yymore();
146                         }
147<brace>"("               { if (blocknest++) yymore(); }
148<brace>[^;\(\)]          { if (blocknest) yymore(); }
149<brace>";"               {
150                           if (blocknest)
151                           {
152                             lvalp->name = dupyytext();
153                             return STRINGTOK;
154                           }
155                         }
156<brace>")"               {
157                           if (--blocknest <= 0)
158                           {
159                             yy_noeof = 0;
160                             BEGIN(INITIAL);
161                             lvalp->name = dupyytext();
162                             return STRINGTOK;
163                           }
164                           yymore();
165                         }
166<bracestr>"\""           {
167                           yy_noeof = noeof_brace;
168                           BEGIN(brace);
169                           yymore();
170                         }
171<bracestr>[^\"]          { yymore(); }
172<bracket>"("             { return '('; }
173<bracket>","             { return ','; }
174<bracket>[ \t\n]*        { ; }
175<bracket>[^\(\), \t\n]*  {
176                           lvalp->name = mstrdup((char *)yytext);
177                           return STRINGTOK;
178                         }
179<bracket>\"[^\"]*\"      {
180                           lvalp->name = mstrdup((char *)yytext);
181                           return STRINGTOK;
182                         }
183<bracket>")"             {
184                           yy_noeof = 0; BEGIN(INITIAL);
185                           return ')';
186                         }
187
188"{"                      {
189                           yy_blocklineno = yylineno;
190                           blocknest = 1;
191                           yy_noeof = noeof_block;
192                           BEGIN(block);
193                         }
194<block>"\""              {
195                           yy_noeof = noeof_string;
196                           BEGIN(blockstr);
197                           yymore();
198                         }
199<blockstr>[^\"]          { yymore(); }
200<blockstr>"\\\\"         { yymore(); }
201<blockstr>"\\\""         { yymore(); }
202<blockstr>"\""           {
203                           yy_noeof = noeof_block;
204                           BEGIN(block);
205                           yymore();
206                         }
207<block>[^\{\}\"]*        { yymore(); }
208<block>\/\/[^\n]*        { yymore(); }
209<block>"{"               { blocknest++; yymore(); }
210<block>"}"               {
211                           if (--blocknest <= 0)
212                           {
213                             BEGIN(INITIAL);
214                             yy_noeof = 0;
215                             lvalp->name = dupyytextNL();
216                             return BLOCKTOK;
217                           }
218                           yymore();
219                         }
220"\""                     { BEGIN(string); yy_noeof = noeof_string;}
221~                        { return SYS_BREAK; }
222<string>[^\"]            { yymore(); }
223<string>"\\\\"           { yymore(); }
224<string>"\\\""           { yymore(); }
225<string>"\""             {
226                           char * s;
227                           yy_noeof = 0;
228                           BEGIN(INITIAL);
229                           s = lvalp->name = dupyytext();
230                           while (*yytext)
231                           {
232                             if (*yytext == '\\') yytext++;
233                             *s++ = *yytext++;
234                           }
235                           *s++ = *yytext++;
236                           return STRINGTOK;
237                         }
238
239[ \t\r\n]                /* skip whitespace */
240".."                     { return DOTDOT; }
241"::"                     { return COLONCOLON; }
242"--"                     { return MINUSMINUS; }
243"++"                     { return PLUSPLUS  ; }
244"=="                     { return EQUAL_EQUAL; }
245"&&"                     { return '&'; }
246"||"                     { return '|'; }
247"<="                     { return LE; }
248">="                     { return GE; }
249"!"                      { return NOT; }
250"!="                     { return NOTEQUAL; }
251"<>"                     { return NOTEQUAL; }
252"**"                     { return '^'; }
253\\                       { return '\\'; }
254newline                  {
255                           lvalp->name = mstrdup("\n");
256                           return STRINGTOK;
257                         }
258{integer}                {
259                           lvalp->name = (char *)yytext;
260                           if ((currRing!=NULL)
261                           && (strlen(lvalp->name)>MAX_INT_LEN))
262                           {
263                             lvalp->name = mstrdup((char *)yytext);
264                             return RINGVAR;
265                           }
266                           else
267                             return INT_CONST;
268                         }
269{integer}\/{integer}     {
270                           lvalp->name = mstrdup((char *)yytext);
271                           return RINGVAR;
272                         }
273\$                       {
274                           m2_end(-1);
275                         }
276(quit|exit)[ \t\n]*[\.;]?  {
277                           #ifdef MM_STAT
278                           mmStat(-500);
279                           #endif
280                           #ifdef MDEBUG
281                             #ifdef MLIST
282                             mmTestList(0);
283                             #endif
284                           #endif
285                           m2_end(0);
286                         }
287
288{rgvars}|{realnum}       {
289                           lvalp->name = mstrdup((char *)yytext);
290                           return RINGVAR;
291                         }
292
293({parname}|{name})       {
294                           /* {name} */
295                           int rc=0;
296                           if (yytext[strlen((char *)yytext)-1] == '\n')
297                           {
298                             yytext[strlen((char *)yytext)-1] = '\0';
299                           }
300                           if (yyleng > 1)
301                           {
302                             rc = IsCmd((char *)yytext,lvalp->i);
303                             if (rc) return rc;
304                           }
305                           lvalp->name = mstrdup((char *)yytext);
306                           return UNKNOWN_IDENT;
307                         }
308
309.                       {
310                           /*if (*yytext == '\n') REJECT;*/
311                           lvalp->i = *yytext;   /* token has own value */
312                           return *yytext;
313                         }
314%%
315
316void * myynewbuffer()
317{
318  void * oldb = yy_current_buffer;
319  yy_switch_to_buffer(yy_create_buffer(NULL, YY_BUF_SIZE));
320  return oldb;
321}
322
323void myyoldbuffer(void * oldb)
324{
325  yy_delete_buffer(yy_current_buffer);
326  yy_switch_to_buffer((YY_BUFFER_STATE)oldb);
327  //yy_flush_buffer((YY_BUFFER_STATE)oldb);
328}
Note: See TracBrowser for help on using the repository browser.