pike.git / src / lex.c

version» Context lines:

pike.git/src/lex.c:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/ + /**/   #include "global.h" - RCSID("$Id: lex.c,v 1.62 1999/02/10 01:29:06 hubbe Exp $"); + RCSID("$Id: lex.c,v 1.63 1999/02/20 17:47:02 grubba Exp $");   #include "language.h"   #include "array.h"   #include "lex.h"   #include "stralloc.h"   #include "dynamic_buffer.h"   #include "constants.h"   #include "hashtable.h"   #include "stuff.h"   #include "pike_memory.h"   #include "interpret.h"
pike.git/src/lex.c:327:    {    return instrs[n-F_OFFSET].name;    }else{    sprintf(buf, "<OTHER %d>", n);    return buf;    }   }      struct lex lex;    - #define LOOK() EXTRACT_UCHAR(lex.pos) - #define GETC() EXTRACT_UCHAR(lex.pos++) - #define GOBBLE(c) (LOOK()==c?(lex.pos++,1):0) - #define SKIPSPACE() do { while(ISSPACE(LOOK()) && LOOK()!='\n') lex.pos++; }while(0) - #define SKIPWHITE() do { while(ISSPACE(LOOK())) lex.pos++; }while(0) - #define SKIPUPTO(X) do { while(LOOK()!=(X) && LOOK()) lex.pos++; }while(0) + /* Make lexers for shifts 0, 1 and 2. */    - #define READBUF(X) { \ -  register int C; \ -  buf=lex.pos; \ -  while((C=LOOK()) && (X)) lex.pos++; \ -  len=lex.pos - buf; \ - } + #define SHIFT 0 + #include "lexer.h" + #undef SHIFT + #define SHIFT 1 + #include "lexer.h" + #undef SHIFT + #define SHIFT 2 + #include "lexer.h" + #undef SHIFT    - #define TWO_CHAR(X,Y) ((X)<<8)+(Y) - #define ISWORD(X) (len==(long)strlen(X) && !MEMCMP(buf,X,strlen(X))) -  - /*** Lexical analyzing ***/ -  - static int char_const(void) - { -  int c; -  switch(c=GETC()) -  { -  case 0: -  lex.pos--; -  yyerror("Unexpected end of file\n"); -  return 0; -  -  case '0': case '1': case '2': case '3': -  case '4': case '5': case '6': case '7': -  c-='0'; -  while(LOOK()>='0' && LOOK()<='8') -  c=c*8+(GETC()-'0'); -  return c; -  -  case 'r': return '\r'; -  case 'n': return '\n'; -  case 't': return '\t'; -  case 'b': return '\b'; -  -  case '\n': -  lex.current_line++; -  return '\n'; -  -  case 'x': -  c=0; -  while(1) -  { -  switch(LOOK()) -  { -  default: return c; -  case '0': case '1': case '2': case '3': -  case '4': case '5': case '6': case '7': -  case '8': case '9': -  c=c*16+GETC()-'0'; -  break; -  -  case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': -  c=c*16+GETC()-'a'+10; -  break; -  -  case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': -  c=c*16+GETC()-'A'+10; -  break; -  } -  } -  -  case 'd': -  c=0; -  while(1) -  { -  switch(LOOK()) -  { -  default: return c; -  case '0': case '1': case '2': case '3': -  case '4': case '5': case '6': case '7': -  case '8': case '9': -  c=c*10+GETC()-'0'; -  break; -  } -  } -  } -  return c; - } -  - static struct pike_string *readstring(void) - { -  int c; -  struct string_builder tmp; -  init_string_builder(&tmp,0); -  -  while(1) -  { -  switch(c=GETC()) -  { -  case 0: -  lex.pos--; -  yyerror("End of file in string."); -  break; -  -  case '\n': -  lex.current_line++; -  yyerror("Newline in string."); -  break; -  -  case '\\': -  string_builder_putchar(&tmp,char_const()); -  continue; -  -  case '"': -  break; -  -  default: -  string_builder_putchar(&tmp,c); -  continue; -  } -  break; -  } -  return finish_string_builder(&tmp); - } -  +    int yylex(YYSTYPE *yylval) - #if LEXDEBUG>4 +    { -  int t; -  int yylex2(YYSTYPE *); -  t=yylex2(yylval); -  if(t<256) -  { -  fprintf(stderr,"YYLEX: '%c' (%d) at %s:%d\n",t,t,lex.current_file->str,lex.current_line); -  }else{ -  fprintf(stderr,"YYLEX: %s (%d) at %s:%d\n",low_get_f_name(t,0),t,lex.current_file->str,lex.current_line); + #if LEXDEBUG>8 +  fprintf(stderr, "YYLEX: Calling lexer at 0x%08lx\n", +  (long)lex.current_lexer); + #endif /* LEXDEBUG > 8 */ +  return(lex.current_lexer(yylval));   } -  return t; - } +     - static int yylex2(YYSTYPE *yylval) - #endif - { -  INT32 c,len; -  char *buf; +     - #ifdef __CHECKER__ -  MEMSET((char *)yylval,0,sizeof(YYSTYPE)); - #endif - #ifdef MALLOC_DEBUG -  check_sfltable(); - #endif +     -  while(1) -  { -  switch(c=GETC()) -  { -  case 0: -  lex.pos--; - #ifdef F_LEX_EOF -  return F_LEX_EOF; - #else /* !F_LEX_EOF */ -  return 0; - #endif /* F_LEX_EOF */ -  -  case '\n': -  lex.current_line++; -  continue; -  -  case '#': -  SKIPSPACE(); -  READBUF(C!=' ' && C!='\t' && C!='\n'); -  -  switch(len>0?buf[0]:0) -  { -  char *p; -  -  case 'l': -  if(!ISWORD("line")) goto badhash; -  READBUF(C!=' ' && C!='\t' && C!='\n'); -  -  case '0': case '1': case '2': case '3': case '4': -  case '5': case '6': case '7': case '8': case '9': -  lex.current_line=atoi(buf)-1; -  SKIPSPACE(); -  if(GOBBLE('"')) -  { -  struct pike_string *tmp=readstring(); -  free_string(lex.current_file); -  lex.current_file=tmp; -  } -  break; -  -  case 'e': -  if(ISWORD("error")) -  { -  SKIPSPACE(); -  READBUF(C!='\n'); -  yyerror(buf); -  break; -  } -  goto badhash; -  -  case 'p': -  if(ISWORD("pragma")) -  { -  SKIPSPACE(); -  READBUF(C!='\n'); -  if (strcmp(buf, "all_inline") == 0) -  { -  lex.pragmas |= ID_INLINE; -  } -  else if (strcmp(buf, "all_nomask") == 0) -  { -  lex.pragmas |= ID_NOMASK; -  } -  break; -  } -  -  badhash: -  if (sizeof(buf) < 1024) { -  my_yyerror("Unknown preprocessor directive #%s.",buf); -  } else { -  my_yyerror("Unknown preprocessor directive."); -  } -  SKIPUPTO('\n'); -  continue; -  } -  continue; -  -  case ' ': -  case '\t': -  continue; -  -  case '\'': -  switch(c=GETC()) -  { -  case 0: -  lex.pos--; -  yyerror("Unexpected end of file\n"); -  break; -  -  case '\\': -  c=char_const(); -  } -  if(!GOBBLE('\'')) -  yyerror("Unterminated character constant."); -  yylval->number=c; -  return F_NUMBER; -  -  case '"': -  { -  struct pike_string *s=readstring(); -  yylval->n=mkstrnode(s); -  free_string(s); -  return F_STRING; -  } -  -  case ':': -  if(GOBBLE(':')) return F_COLON_COLON; -  return c; -  -  case '.': -  if(GOBBLE('.')) -  { -  if(GOBBLE('.')) return F_DOT_DOT_DOT; -  return F_DOT_DOT; -  } -  return c; -  -  case '0': -  if(GOBBLE('x') || GOBBLE('X')) -  { -  yylval->number=STRTOL(lex.pos, &lex.pos, 16); -  return F_NUMBER; -  } -  -  case '1': case '2': case '3': case '4': -  case '5': case '6': case '7': case '8': case '9': -  { -  char *p1, *p2; -  double f; -  long l; -  lex.pos--; -  if(lex.pos[0]=='0') -  for(l=1;lex.pos[l]<='9' && lex.pos[l]>='0';l++) -  if(lex.pos[l]>='8') -  yyerror("Illegal octal number."); -  -  f=my_strtod(lex.pos, &p1); -  l=STRTOL(lex.pos, &p2, 0); -  -  if(p1>p2) -  { -  lex.pos=p1; -  yylval->fnum=(FLOAT_TYPE)f; -  return F_FLOAT; -  }else{ -  lex.pos=p2; -  yylval->number=l; -  return F_NUMBER; -  } -  -  case '-': -  if(GOBBLE('=')) return F_SUB_EQ; -  if(GOBBLE('>')) return F_ARROW; -  if(GOBBLE('-')) return F_DEC; -  return '-'; -  -  case '+': -  if(GOBBLE('=')) return F_ADD_EQ; -  if(GOBBLE('+')) return F_INC; -  return '+'; -  -  case '&': -  if(GOBBLE('=')) return F_AND_EQ; -  if(GOBBLE('&')) return F_LAND; -  return '&'; -  -  case '|': -  if(GOBBLE('=')) return F_OR_EQ; -  if(GOBBLE('|')) return F_LOR; -  return '|'; -  -  case '^': -  if(GOBBLE('=')) return F_XOR_EQ; -  return '^'; -  -  case '*': -  if(GOBBLE('=')) return F_MULT_EQ; -  return '*'; -  -  case '%': -  if(GOBBLE('=')) return F_MOD_EQ; -  return '%'; -  -  case '/': -  if(GOBBLE('=')) return F_DIV_EQ; -  return '/'; -  -  case '=': -  if(GOBBLE('=')) return F_EQ; -  return '='; -  -  case '<': -  if(GOBBLE('<')) -  { -  if(GOBBLE('=')) return F_LSH_EQ; -  return F_LSH; -  } -  if(GOBBLE('=')) return F_LE; -  return '<'; -  -  case '>': -  if(GOBBLE(')')) return F_MULTISET_END; -  if(GOBBLE('=')) return F_GE; -  if(GOBBLE('>')) -  { -  if(GOBBLE('=')) return F_RSH_EQ; -  return F_RSH; -  } -  return '>'; -  -  case '!': -  if(GOBBLE('=')) return F_NE; -  return F_NOT; -  -  case '(': -  if(GOBBLE('<')) return F_MULTISET_START; -  return '('; -  -  case ']': -  case '?': -  case ',': -  case '~': -  case '@': -  case ')': -  case '[': -  case '{': -  case ';': -  case '}': return c; -  -  case '`': -  { -  char *tmp; -  int offset=2; -  if(GOBBLE('`')) offset--; -  if(GOBBLE('`')) offset--; -  -  switch(GETC()) -  { -  case '/': tmp="```/"; break; -  case '%': tmp="```%"; break; -  case '*': tmp="```*"; break; -  case '&': tmp="```&"; break; -  case '|': tmp="```|"; break; -  case '^': tmp="```^"; break; -  case '~': tmp="```~"; break; -  case '+': -  if(GOBBLE('=')) { tmp="```+="; break; } -  tmp="```+"; -  break; -  case '<': -  if(GOBBLE('<')) { tmp="```<<"; break; } -  if(GOBBLE('=')) { tmp="```<="; break; } -  tmp="```<"; -  break; -  -  case '>': -  if(GOBBLE('>')) { tmp="```>>"; break; } -  if(GOBBLE('=')) { tmp="```>="; break; } -  tmp="```>"; -  break; -  -  case '!': -  if(GOBBLE('=')) { tmp="```!="; break; } -  tmp="```!"; -  break; -  -  case '=': -  if(GOBBLE('=')) { tmp="```=="; break; } -  tmp="```="; -  break; -  -  case '(': -  if(GOBBLE(')')) -  { -  tmp="```()"; -  break; -  } -  yyerror("Illegal ` identifier."); -  tmp="``"; -  break; -  -  case '-': -  if(GOBBLE('>')) -  { -  tmp="```->"; -  if(GOBBLE('=')) tmp="```->="; -  }else{ -  tmp="```-"; -  } -  break; -  -  case '[': -  if(GOBBLE(']')) -  { -  tmp="```[]"; -  if(GOBBLE('=')) tmp="```[]="; -  break; -  } -  -  default: -  yyerror("Illegal ` identifier."); -  lex.pos--; -  tmp="``"; -  break; -  } -  -  { -  struct pike_string *s=make_shared_string(tmp+offset); -  yylval->n=mkstrnode(s); -  free_string(s); -  return F_IDENTIFIER; -  } -  } -  -  -  default: -  if(isidchar(c)) -  { -  struct pike_string *s; -  lex.pos--; -  READBUF(isidchar(C)); -  -  yylval->number=lex.current_line; -  -  if(len>1 && len<10) -  { -  switch(TWO_CHAR(buf[0],buf[1])) -  { -  case TWO_CHAR('a','r'): -  if(ISWORD("array")) return F_ARRAY_ID; -  break; -  case TWO_CHAR('b','r'): -  if(ISWORD("break")) return F_BREAK; -  break; -  case TWO_CHAR('c','a'): -  if(ISWORD("case")) return F_CASE; -  if(ISWORD("catch")) return F_CATCH; -  break; -  case TWO_CHAR('c','l'): -  if(ISWORD("class")) return F_CLASS; -  break; -  case TWO_CHAR('c','o'): -  if(ISWORD("constant")) return F_CONSTANT; -  if(ISWORD("continue")) return F_CONTINUE; -  break; -  case TWO_CHAR('d','e'): -  if(ISWORD("default")) return F_DEFAULT; -  break; -  case TWO_CHAR('d','o'): -  if(ISWORD("do")) return F_DO; -  break; -  case TWO_CHAR('e','l'): -  if(ISWORD("else")) return F_ELSE; -  break; -  case TWO_CHAR('f','i'): -  if(ISWORD("final")) return F_FINAL_ID; -  break; -  case TWO_CHAR('f','l'): -  if(ISWORD("float")) return F_FLOAT_ID; -  break; -  case TWO_CHAR('f','o'): -  if(ISWORD("for")) return F_FOR; -  if(ISWORD("foreach")) return F_FOREACH; -  break; -  case TWO_CHAR('f','u'): -  if(ISWORD("function")) return F_FUNCTION_ID; -  break; -  case TWO_CHAR('g','a'): -  if(ISWORD("gauge")) return F_GAUGE; -  break; -  case TWO_CHAR('i','f'): -  if(ISWORD("if")) return F_IF; -  break; -  case TWO_CHAR('i','m'): -  if(ISWORD("import")) return F_IMPORT; -  break; -  case TWO_CHAR('i','n'): -  if(ISWORD("int")) return F_INT_ID; -  if(ISWORD("inherit")) return F_INHERIT; -  if(ISWORD("inline")) return F_INLINE; -  break; -  case TWO_CHAR('l','a'): -  if(ISWORD("lambda")) return F_LAMBDA; -  break; -  case TWO_CHAR('l','o'): -  if(ISWORD("local")) return F_LOCAL_ID; -  break; -  case TWO_CHAR('m','a'): -  if(ISWORD("mapping")) return F_MAPPING_ID; -  break; -  case TWO_CHAR('m','i'): -  if(ISWORD("mixed")) return F_MIXED_ID; -  break; -  case TWO_CHAR('m','u'): -  if(ISWORD("multiset")) return F_MULTISET_ID; -  break; -  case TWO_CHAR('n','o'): -  if(ISWORD("nomask")) return F_NO_MASK; -  break; -  case TWO_CHAR('o','b'): -  if(ISWORD("object")) return F_OBJECT_ID; -  break; -  case TWO_CHAR('p','r'): -  if(ISWORD("predef")) return F_PREDEF; -  if(ISWORD("program")) return F_PROGRAM_ID; -  if(ISWORD("private")) return F_PRIVATE; -  if(ISWORD("protected")) return F_PROTECTED; -  break; -  break; -  case TWO_CHAR('p','u'): -  if(ISWORD("public")) return F_PUBLIC; -  break; -  case TWO_CHAR('r','e'): -  if(ISWORD("return")) return F_RETURN; -  break; -  case TWO_CHAR('s','s'): -  if(ISWORD("sscanf")) return F_SSCANF; -  break; -  case TWO_CHAR('s','t'): -  if(ISWORD("static")) return F_STATIC; -  if(ISWORD("string")) return F_STRING_ID; -  break; -  case TWO_CHAR('s','w'): -  if(ISWORD("switch")) return F_SWITCH; -  break; -  case TWO_CHAR('t','y'): -  if(ISWORD("typeof")) return F_TYPEOF; -  break; -  case TWO_CHAR('v','o'): -  if(ISWORD("void")) return F_VOID_ID; -  break; -  case TWO_CHAR('w','h'): -  if(ISWORD("while")) return F_WHILE; -  break; -  } -  } -  { -  struct pike_string *tmp=make_shared_binary_string(buf,len); -  yylval->n=mkstrnode(tmp); -  free_string(tmp); -  return F_IDENTIFIER; -  } -  }else{ -  char buff[100]; -  sprintf(buff, "Illegal character (hex %02x) '%c'", c, c); -  yyerror(buff); -  return ' '; -  } -  } -  } -  } - } -  +