source: git/Singular/scanner.l @ 7b3094

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