⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lex.cc

📁 早期freebsd实现
💻 CC
📖 第 1 页 / 共 3 页
字号:
    if (c == 'i') {      input_stack::get_char();      c = input_stack::peek_char();      if (c == 'd') {	input_stack::get_char();	c = input_stack::peek_char();	if (c == 't') {	  input_stack::get_char();	  c = input_stack::peek_char();	  if (c == 'h') {	    input_stack::get_char();	    context_buffer = ".width";	    return DOT_WID;	  }	  input_stack::push_back('t');	}	context_buffer = ".wid";	return DOT_WID;      }      input_stack::push_back('i');    }    context_buffer = ".w";    return DOT_W;  case 's':    input_stack::get_char();    c = input_stack::peek_char();    if (c == 'e') {      input_stack::get_char();      context_buffer = ".se";      return DOT_SE;    }    else if (c == 'w') {      input_stack::get_char();      context_buffer = ".sw";      return DOT_SW;    }    else {      if (c == 't') {	input_stack::get_char();	c = input_stack::peek_char();	if (c == 'a') {	  input_stack::get_char();	  c = input_stack::peek_char();	  if (c == 'r') {	    input_stack::get_char();	    c = input_stack::peek_char();	    if (c == 't') {	      input_stack::get_char();	      context_buffer = ".start";	      return DOT_START;	    }	    input_stack::push_back('r');	  }	  input_stack::push_back('a');	}	input_stack::push_back('t');      }      context_buffer = ".s";      return DOT_S;    }    break;  case 't':    input_stack::get_char();    c = input_stack::peek_char();    if (c == 'o') {      input_stack::get_char();      c = input_stack::peek_char();      if (c == 'p') {	input_stack::get_char();	context_buffer = ".top";	return DOT_N;      }      input_stack::push_back('o');    }    context_buffer = ".t";    return DOT_N;  case 'l':    input_stack::get_char();    c = input_stack::peek_char();    if (c == 'e') {      input_stack::get_char();      c = input_stack::peek_char();      if (c == 'f') {	input_stack::get_char();	c = input_stack::peek_char();	if (c == 't') {	  input_stack::get_char();	  context_buffer = ".left";	  return DOT_W;	}	input_stack::push_back('f');      }      input_stack::push_back('e');    }    context_buffer = ".l";    return DOT_W;  case 'r':    input_stack::get_char();    c = input_stack::peek_char();    if (c == 'a') {      input_stack::get_char();      c = input_stack::peek_char();      if (c == 'd') {	input_stack::get_char();	context_buffer = ".rad";	return DOT_RAD;      }      input_stack::push_back('a');    }    else if (c == 'i') {      input_stack::get_char();      c = input_stack::peek_char();      if (c == 'g') {	input_stack::get_char();	c = input_stack::peek_char();	if (c == 'h') {	  input_stack::get_char();	  c = input_stack::peek_char();	  if (c == 't') {	    input_stack::get_char();	    context_buffer = ".right";	    return DOT_E;	  }	  input_stack::push_back('h');	}	input_stack::push_back('g');      }      input_stack::push_back('i');    }    context_buffer = ".r";    return DOT_E;  case 'b':    input_stack::get_char();    c = input_stack::peek_char();    if (c == 'o') {      input_stack::get_char();      c = input_stack::peek_char();      if (c == 't') {	input_stack::get_char();	c = input_stack::peek_char();	if (c == 't') {	  input_stack::get_char();	  c = input_stack::peek_char();	  if (c == 'o') {	    input_stack::get_char();	    c = input_stack::peek_char();	    if (c == 'm') {	      input_stack::get_char();	      context_buffer = ".bottom";	      return DOT_S;	    }	    input_stack::push_back('o');	  }	  input_stack::push_back('t');	}	context_buffer = ".bot";	return DOT_S;      }      input_stack::push_back('o');    }    context_buffer = ".b";    return DOT_S;  default:    context_buffer = '.';    return '.';  }}int get_token(int lookup_flag){  context_buffer.clear();  for (;;) {    int n = 0;    int bol = input_stack::bol();    int c = input_stack::get_char();    if (bol && c == command_char) {      token_buffer.clear();      token_buffer += c;      // the newline is not part of the token      for (;;) {	c = input_stack::peek_char();	if (c == EOF || c == '\n')	  break;	input_stack::get_char();	token_buffer += char(c);      }      context_buffer = token_buffer;      return COMMAND_LINE;    }    switch (c) {    case EOF:      return EOF;    case ' ':    case '\t':      break;    case '\\':      {	int d = input_stack::peek_char();	if (d != '\n') {	  context_buffer = '\\';	  return '\\';	}	input_stack::get_char();	break;      }    case '#':      do {	c = input_stack::get_char();      } while (c != '\n' && c != EOF);      if (c == '\n')	context_buffer = '\n';      return c;    case '"':      context_buffer = '"';      token_buffer.clear();      for (;;) {	c = input_stack::get_char();	if (c == '\\') {	  context_buffer += '\\';	  c = input_stack::peek_char();	  if (c == '"') {	    input_stack::get_char();	    token_buffer += '"';	    context_buffer += '"';	  }	  else	    token_buffer += '\\';	}	else if (c == '\n') {	  error("newline in string");	  break;	}	else if (c == EOF) {	  error("missing `\"'");	  break;	}	else if (c == '"') {	  context_buffer += '"';	  break;	}	else {	  context_buffer += char(c);	  token_buffer += char(c);	}      }      return TEXT;    case '0':    case '1':    case '2':    case '3':    case '4':    case '5':    case '6':    case '7':    case '8':    case '9':      {   	int overflow = 0;	n = 0;	for (;;) {	  if (n > (INT_MAX - 9)/10) {	    overflow = 1;	    break;	  }	  n *= 10;	  n += c - '0';	  context_buffer += char(c);	  c = input_stack::peek_char();	  if (c == EOF || !csdigit(c))	    break;	  c = input_stack::get_char();	}	token_double = n;	if (overflow) {	  for (;;) {	    token_double *= 10.0;	    token_double += c - '0';	    context_buffer += char(c);	    c = input_stack::peek_char();	    if (c == EOF || !csdigit(c))	      break;	    c = input_stack::get_char();	  }	  // if somebody asks for 1000000000000th, we will silently	  // give them INT_MAXth	  double temp = token_double; // work around gas 1.34/sparc bug	  if (token_double > INT_MAX)	    n = INT_MAX;	  else	    n = int(temp);	}      }      switch (c) {      case 'i':      case 'I':	context_buffer += char(c);	input_stack::get_char();	return NUMBER;      case '.':	{	  context_buffer += '.';	  input_stack::get_char();	got_dot:	  double factor = 1.0;	  for (;;) {	    c = input_stack::peek_char();	    if (!c == EOF || !csdigit(c))	      break;	    input_stack::get_char();	    context_buffer += char(c);	    factor /= 10.0;	    if (c != '0')	      token_double += factor*(c - '0');	  }	  if (c != 'e' && c != 'E') {	    if (c == 'i' || c == 'I') {	      context_buffer += char(c);	      input_stack::get_char();	    }	    return NUMBER;	  }	}	// fall through      case 'e':      case 'E':	{	  int echar = c;	  input_stack::get_char();	  c = input_stack::peek_char();	  int sign = '+';	  if (c == '+' || c == '-') {	    sign = c;	    input_stack::get_char();	    c = input_stack::peek_char();	    if (c == EOF || !csdigit(c)) {	      input_stack::push_back(sign);	      input_stack::push_back(echar);	      return NUMBER;	    }	    context_buffer += char(echar);	    context_buffer += char(sign);	  }	  else {	    if (c == EOF || !csdigit(c)) {	      input_stack::push_back(echar);	      return NUMBER;	    }	    context_buffer += char(echar);	  }	  input_stack::get_char();	  context_buffer += char(c);	  n = c - '0';	  for (;;) {	    c = input_stack::peek_char();	    if (c == EOF || !csdigit(c))	      break;	    input_stack::get_char();	    context_buffer += char(c);	    n = n*10 + (c - '0');	  }	  if (sign == '-')	    n = -n;	  if (c == 'i' || c == 'I') {	    context_buffer += char(c);	    input_stack::get_char();	  }	  token_double *= pow(10.0, n);	  return NUMBER;	}      case 'n':	input_stack::get_char();	c = input_stack::peek_char();	if (c == 'd') {	  input_stack::get_char();	  token_int = n;	  context_buffer += "nd";	  return ORDINAL;	}	input_stack::push_back('n');	return NUMBER;      case 'r':	input_stack::get_char();	c = input_stack::peek_char();	if (c == 'd') {	  input_stack::get_char();	  token_int = n;	  context_buffer += "rd";	  return ORDINAL;	}	input_stack::push_back('r');	return NUMBER;      case 't':	input_stack::get_char();	c = input_stack::peek_char();	if (c == 'h') {	  input_stack::get_char();	  token_int = n;	  context_buffer += "th";	  return ORDINAL;	}	input_stack::push_back('t');	return NUMBER;      case 's':	input_stack::get_char();	c = input_stack::peek_char();	if (c == 't') {	  input_stack::get_char();	  token_int = n;	  context_buffer += "st";	  return ORDINAL;	}	input_stack::push_back('s');	return NUMBER;      default:	return NUMBER;      }      break;    case '\'':      {	c = input_stack::peek_char();	if (c == 't') {	  input_stack::get_char();	  c = input_stack::peek_char();	  if (c == 'h') {	    input_stack::get_char();	    context_buffer = "'th";	    return TH;	  }	  else	    input_stack::push_back('t');	}	context_buffer = "'";	return '\'';      }    case '.':      {	c = input_stack::peek_char();	if (c != EOF && csdigit(c)) {	  n = 0;	  token_double = 0.0;	  context_buffer = '.';	  goto got_dot;	}	return get_token_after_dot(c);      }    case '<':      c = input_stack::peek_char();      if (c == '-') {	input_stack::get_char();	c = input_stack::peek_char();	if (c == '>') {	  input_stack::get_char();	  context_buffer = "<->";	  return DOUBLE_ARROW_HEAD;	}	context_buffer = "<-";	return LEFT_ARROW_HEAD;      }      else if (c == '=') {	input_stack::get_char();	context_buffer = "<=";	return LESSEQUAL;      }      context_buffer = "<";      return '<';    case '-':      c = input_stack::peek_char();      if (c == '>') {	input_stack::get_char();	context_buffer = "->";	return RIGHT_ARROW_HEAD;      }      context_buffer = "-";      return '-';    case '!':      c = input_stack::peek_char();      if (c == '=') {	input_stack::get_char();	context_buffer = "!=";	return NOTEQUAL;      }      context_buffer = "!";      return '!';    case '>':      c = input_stack::peek_char();      if (c == '=') {	input_stack::get_char();	context_buffer = ">=";	return GREATEREQUAL;      }      context_buffer = ">";      return '>';    case '=':      c = input_stack::peek_char();      if (c == '=') {	input_stack::get_char();	context_buffer = "==";	return EQUALEQUAL;      }      context_buffer = "=";      return '=';    case '&':      c = input_stack::peek_char();      if (c == '&') {	input_stack::get_char();	context_buffer = "&&";	return ANDAND;      }      context_buffer = "&";      return '&';    case '|':      c = input_stack::peek_char();      if (c == '|') {	input_stack::get_char();	context_buffer = "||";	return OROR;      }      context_buffer = "|";      return '|';    default:      if (c != EOF && csalpha(c)) {	token_buffer.clear();	token_buffer = c;	for (;;) {	  c = input_stack::peek_char();	  if (c == EOF || (!csalnum(c) && c != '_'))	    break;	  input_stack::get_char();	  token_buffer += char(c);	}	int tok = lookup_keyword(token_buffer.contents(),				 token_buffer.length());	if (tok != 0) {	  context_buffer = token_buffer;	  return tok;	}	char *def = 0;	if (lookup_flag) {	  token_buffer += '\0';	  def = macro_table.lookup(token_buffer.contents());	  token_buffer.set_length(token_buffer.length() - 1);	  if (def) {	    if (c == '(') {	      input_stack::get_char();	      interpolate_macro_with_args(def);	    }	    else	      input_stack::push(new macro_input(def));	  }	}	if (!def) {	  context_buffer = token_buffer;	  if (csupper(token_buffer[0]))	    return LABEL;	  else	    return VARIABLE;	}      }      else {	context_buffer = char(c);	return (unsigned char)c;      }      break;    }  }}int get_delimited(){  token_buffer.clear();  int c = input_stack::get_char();  while (c == ' ' || c == '\t' || c == '\n')    c = input_stack::get_char();  if (c == EOF) {    lex_error("missing delimiter");    return 0;  }  context_buffer = char(c);  int had_newline = 0;  int start = c;  int level = 0;  enum { NORMAL, IN_STRING, IN_STRING_QUOTED, DELIM_END } state = NORMAL;  for (;;) {    c = input_stack::get_char();    if (c == EOF) {      lex_error("missing closing delimiter");      return 0;    }    if (c == '\n')      had_newline = 1;    else if (!had_newline)      context_buffer += char(c);    switch (state) {    case NORMAL:      if (start == '{') {	if (c == '{') {	  level++;	  break;	}	if (c == '}') {	  if (--level < 0)	    state = DELIM_END;	  break;	}      }      else {	if (c == start) {	  state = DELIM_END;	  break;	}      }      if (c == '"')	state = IN_STRING;      break;    case IN_STRING_QUOTED:      if (c == '\n')	state = NORMAL;      else	state = IN_STRING;      break;    case IN_STRING:      if (c == '"' || c == '\n')	state = NORMAL;      else if (c == '\\')	state = IN_STRING_QUOTED;      break;    case DELIM_END:      // This case it just to shut cfront 2.0 up.    default:      assert(0);    }    if (state == DELIM_END)      break;    token_buffer += c;  }  return 1;}void do_define(){  int t = get_token(0);		// do not expand what we are defining  if (t != VARIABLE && t != LABEL) {    lex_error("can only define variable or placename");    return;  }  token_buffer += '\0';  string nm = token_buffer;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -