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); } 394