source: git/Singular/scanner.ll @ 5de33f4

fieker-DuValspielwiese
Last change on this file since 5de33f4 was 85bf0b, checked in by Hans Schoenemann <hannes@…>, 5 years ago
rename token RINGVAR -> MONOM
  • Property mode set to 100644
File size: 12.4 KB
Line 
1%{
2/****************************************
3*  Computer Algebra System SINGULAR     *
4****************************************/
5#include <stdio.h>
6#include <string.h>
7#include <stdlib.h>
8#include <ctype.h>
9
10#include "kernel/mod2.h"
11#include "omalloc/omalloc.h"
12#include "Singular/tok.h"
13#include "Singular/stype.h"
14#include "Singular/ipshell.h"
15#include "Singular/fevoices.h"
16#include "kernel/oswrapper/feread.h"
17
18int feReadLine(char* b, int l);
19#define ALLOC(a) omAlloc((a))
20#ifndef NEW_FLEX
21#endif /* NEW_LEX */
22int blocknest = 0;
23extern char * yytext;
24//extern unsigned char * yytext;
25extern int yyleng;
26extern int inerror;
27
28#ifndef SING_NDEBUG
29// this is to  shadow the malloc/realloc
30// used by yy_flex_malloc/yy_flex_realloc
31// so that we can mark stuff as static
32static void* my_malloc(size_t size)
33{
34  void* addr = omAlloc(size);
35  omMarkAsStaticAddr(addr);
36  return addr;
37}
38
39static void* my_realloc(void* addr, size_t size)
40{
41  void* new_addr = omRealloc(addr, size);
42  omMarkAsStaticAddr(new_addr);
43  return new_addr;
44}
45#undef malloc
46#define malloc my_malloc
47#undef realloc
48#define realloc my_realloc
49#else
50#undef malloc
51#define malloc omAlloc
52#undef realloc
53#define realloc omRealloc
54#endif
55#undef free
56#define free omFree
57static char * dupyytext()
58{
59  char* s;
60  if (yyleng>0) yytext[yyleng-1] = '\0';
61  s = omStrDup((char *)yytext);
62  omMarkAsStaticAddr(s);
63  return s;
64}
65
66static char * dupyytextNL()
67{
68  int i = yyleng;//strlen((char *)yytext);
69  char * rc = (char*)omAlloc( 3 + i );
70  omMarkAsStaticAddr(rc);
71  if (i>0)
72  {
73    strncpy( rc, (char *)yytext, i-1 );
74  }
75  else
76  {
77    i++;
78  }
79  rc[i-1] = '\n';
80  rc[i] = '\n';
81  rc[i+1] = '\0';
82  return rc;
83}
84
85  #undef YY_DECL
86  #define YY_DECL int yylex(YYSTYPE* lvalp)
87
88  #undef yywrap
89  extern "C" {
90  int yywrap() { return exitVoice(); }
91  }
92
93  #undef YY_INPUT
94  #define YY_INPUT(buf,result,max_size) \
95          result = feReadLine( (char *) (buf), (max_size) )
96
97  #undef YY_USER_ACTION
98  #define YY_USER_ACTION \
99          if ((inerror==1)&&(*yytext>=' '))\
100          { Print("   skipping text from `%s`",yytext);inerror=2; }
101
102%}
103
104digit          [0-9]
105letter         [@a-zA-Z\']
106integer        {digit}+
107monom          {letter}+{digit}*
108rgvars         ({digit}+[/])*{digit}+{monom}+
109realnum        {digit}*"."{digit}+("e"[+-]{digit}+)?
110name           ({letter}({letter}*{digit}*_*)*|_)
111parname        #
112
113/* %start START */
114%option always-interactive
115
116%x string
117%x block
118%x blockstr
119%x brace
120%x bracestr
121%x bracket
122%x asstring
123
124%%
125\/\/[^\n]*
126^[ \r\t\n]*#![^\n]*
127"/*"                     {
128                           yy_noeof=noeof_comment;
129                           loop
130                           {
131                             REGISTER int c;
132                             while ( (c = yyinput()) != '*' && c != EOF );
133                             if ( c == '*' )
134                             {
135                               while ( (c = yyinput()) == '*' );
136                               if ( c == '/' ) break; /* found the end */
137                             }
138                             else
139                             {
140                               break;
141                             }
142                           }
143                           yy_noeof=0;
144                         }
145while                    { prompt_char='.';
146                           blocknest = 0; yy_noeof = noeof_brace; BEGIN(brace);
147                           return WHILE_CMD;}
148for                      { prompt_char='.';
149                           blocknest = 0; yy_noeof = noeof_brace; BEGIN(brace);
150                           return FOR_CMD;}
151
152("help"|"?")[ \t\n]*     { yy_noeof = noeof_asstring;
153                           BEGIN(asstring);
154                           return HELP_CMD;
155                         }
156
157example[ \t\n]*          { yy_noeof = noeof_asstring;
158                           BEGIN(asstring);
159                           return EXAMPLE_CMD;
160                         }
161
162proc[ \t]+{name}[ \t]*\( {
163                           char c; char *cp;
164                           lvalp->name = omStrDup(iiProcName((char *)yytext,c,cp));
165                           yy_noeof = noeof_procname;
166                           blocknest = 1;
167                           BEGIN(brace);
168                           return PROC_DEF;
169                         }
170<asstring>[^;\n]+        {
171                           lvalp->name = omStrDup((char *)yytext);
172                           yy_noeof = 0; BEGIN(INITIAL);
173                           return STRINGTOK;
174                         }
175<asstring>;              {
176                           yy_noeof = 0; BEGIN(INITIAL);
177                           return *yytext;
178                         }
179
180<brace>"\""              {
181                           yy_noeof = noeof_string;
182                           BEGIN(bracestr);
183                           yymore();
184                         }
185<brace>"("               { if (blocknest++) yymore(); }
186<brace>[^;\(\)]          { if (blocknest) yymore(); }
187<brace>";"               {
188                           if (blocknest)
189                           {
190                             lvalp->name = dupyytext();
191                             return STRINGTOK;
192                           }
193                         }
194<brace>")"               {
195                           if (--blocknest <= 0)
196                           {
197                             yy_noeof = 0;
198                             BEGIN(INITIAL);
199                             lvalp->name = dupyytext();
200                             return STRINGTOK;
201                           }
202                           yymore();
203                         }
204<bracestr>"\""           {
205                           yy_noeof = noeof_brace;
206                           BEGIN(brace);
207                           yymore();
208                         }
209<bracestr>[^\"]          { yymore(); }
210<bracket>"("             { return '('; }
211<bracket>","             { return ','; }
212<bracket>[ \t\n]*        { ; }
213<bracket>[^\(\), \t\n]*  {
214                           lvalp->name = omStrDup((char *)yytext);
215                           return STRINGTOK;
216                         }
217<bracket>\"[^\"]*\"      {
218                           lvalp->name = omStrDup((char *)yytext);
219                           return STRINGTOK;
220                         }
221<bracket>")"             {
222                           yy_noeof = 0; BEGIN(INITIAL);
223                           return ')';
224                         }
225
226"{"                      {
227                           yy_blocklineno = yylineno;
228                           blocknest = 1;
229                           yy_noeof = noeof_block;
230                           BEGIN(block);
231                         }
232<block>"\""              {
233                           yy_noeof = noeof_string;
234                           BEGIN(blockstr);
235                           yymore();
236                         }
237<blockstr>[^\"]          { yymore(); }
238<blockstr>"\\\\"         { yymore(); }
239<blockstr>"\\\""         { yymore(); }
240<blockstr>"\""           {
241                           yy_noeof = noeof_block;
242                           BEGIN(block);
243                           yymore();
244                         }
245<block>[^\{\}\"]*        { yymore(); }
246<block>\/\/[^\n]*        { yymore(); }
247<block>"{"               { blocknest++; yymore(); }
248<block>"}"               {
249                           if (--blocknest <= 0)
250                           {
251                             BEGIN(INITIAL);
252                             yy_noeof = 0;
253                             lvalp->name = dupyytextNL();
254                             return BLOCKTOK;
255                           }
256                           yymore();
257                         }
258"\""                     { BEGIN(string); yy_noeof = noeof_string;}
259~                        { return SYS_BREAK; }
260<string>[^\"]            { yymore(); }
261<string>"\\\\"           { yymore(); }
262<string>"\\\""           { yymore(); }
263<string>"\""             {
264                           char * s;
265                           yy_noeof = 0;
266                           BEGIN(INITIAL);
267                           s = lvalp->name = dupyytext();
268                           while (*yytext)
269                           {
270                             if (*yytext == '\\') yytext++;
271                             *s++ = *yytext++;
272                           }
273                           *s++ = *yytext++;
274                           return STRINGTOK;
275                         }
276
277[ \t\r\n]                /* skip whitespace */
278".."                     { return DOTDOT; }
279"::"                     { return COLONCOLON; }
280"--"                     { return MINUSMINUS; }
281"++"                     { return PLUSPLUS  ; }
282"=="                     { return EQUAL_EQUAL; }
283"&&"                     { lvalp->i='&'; return LOGIC_OP; }
284"||"                     { lvalp->i='|'; return LOGIC_OP; }
285"<="                     { lvalp->i=LE; return COMP_OP; }
286">="                     { lvalp->i=GE; return COMP_OP; }
287"!"                      { return NOT; }
288"!="                     { return NOTEQUAL; }
289"<>"                     { return NOTEQUAL; }
290"**"                     { return '^'; }
291"->"                     { return ARROW; }
292\\                       { return '\\'; }
293newline                  {
294                           lvalp->name = omStrDup("\n");
295                           return STRINGTOK;
296                         }
297{integer}                {
298                           lvalp->name = (char *)yytext;
299                           return INT_CONST;
300                         }
301{integer}\/{integer}     {
302                           lvalp->name = (char *)yytext;
303                           return MONOM;
304                         }
305\$                        {
306                           m2_end(-1);
307                         }
308(quit|exit)[ \t\n]*;     {
309                           #ifdef MM_STAT
310                           mmStat(-500);
311                           #endif
312                           #ifdef OM_TRACK
313                           #ifndef SING_NDEBUG
314                             omPrintUsedTrackAddrs(stdout, 10);
315                           #endif
316                           #endif
317                           m2_end(0);
318                         }
319
320{rgvars}|{realnum}       {
321                           lvalp->name = (char *)yytext;
322                           return MONOM;
323                         }
324[0-9]+\."e"[+-][0-9]+    {
325                           lvalp->name = (char *)yytext;
326                           return MONOM;
327                         }
328[0-9]+\./[^\.]           {
329                           lvalp->name = (char *)yytext;
330                           return MONOM;
331                         }
332
333({parname}|{name})       {
334                           /* {name} */
335                           int rc=0;
336                           if (yytext[strlen((char *)yytext)-1] == '\n')
337                           {
338                             yytext[strlen((char *)yytext)-1] = '\0';
339                           }
340                           if (yyleng > 1)
341                           {
342                             rc = IsCmd((char *)yytext,lvalp->i);
343                             if (rc) return rc;
344                           }
345                           lvalp->name = omStrDup((char *)yytext);
346                           return UNKNOWN_IDENT;
347                         }
348
349.                       {
350                           /*if (*yytext == '\n') REJECT;*/
351                           REGISTER char ch= *yytext;
352                           lvalp->i = ch;
353                           switch(ch)
354                           {
355                             /* case '&': */
356                             case '|':
357                               return LOGIC_OP;
358                             /* case '/': */
359                             case '%':
360                             case '*':
361                               return MULDIV_OP;
362                             /* case '<': */
363                             case '>':
364                               return COMP_OP;
365                             default:
366                               break;
367                            }
368                            return ch;
369                         }
370%%
371
372void * myynewbuffer()
373{
374  void * oldb = YY_CURRENT_BUFFER;
375  yy_switch_to_buffer(yy_create_buffer(NULL, YY_BUF_SIZE));
376  return oldb;
377}
378
379void myyoldbuffer(void * oldb)
380{
381  yy_delete_buffer(YY_CURRENT_BUFFER);
382  yy_switch_to_buffer((YY_BUFFER_STATE)oldb);
383  //yy_flush_buffer((YY_BUFFER_STATE)oldb);
384}
385
386void myychangebuffer()
387{
388  yy_flush_buffer((YY_BUFFER_STATE)YY_CURRENT_BUFFER);
389  yy_delete_buffer(YY_CURRENT_BUFFER);
390  yy_switch_to_buffer(yy_create_buffer(NULL, YY_BUF_SIZE));
391}
392
393void my_yy_flush() { YY_FLUSH_BUFFER;BEGIN(0); }
Note: See TracBrowser for help on using the repository browser.