亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? compiler.cpp

?? FastDb是高效的內存數據庫系統
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
//-< COMPILE.CPP >---------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *
//                          Last update: 15-Jan-99    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Conditional expresion compiler
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include <ctype.h>
#include "database.h"
#include "array.h"
#include "query.h"
#include "cursor.h"
#include "compiler.h"
#include "symtab.h"

nat1 const dbExprNode::nodeTypes[] =
  {
#define DBVM(cop, type, n_opernads, commutative) type,
#include "compiler.d"
    0
  };

nat1 const dbExprNode::nodeOperands[] =
  {
#define DBVM(cop, type, n_operands, commutative) n_operands,
#include "compiler.d"
    0
  };

nat1 const dbExprNode::commutativeOperator[] =
  {
#define DBVM(cop, type, n_operands, commutative) commutative,
#include "compiler.d"
    0
  };


bool        dbCompiler::initialized;

dbExprNodeAllocator dbExprNodeAllocator::instance;

dbExprNodeAllocator::~dbExprNodeAllocator()
{
  dbExprNodeSegment* segm = segmentList;

  while (segm != NULL)
  {
    dbExprNodeSegment* next = segm->next;
    delete segm;
    segm = next;
  }
}

inline dbExprNode* dbExprNodeAllocator::allocate()
{
  dbCriticalSection cs(mutex);
  dbExprNode* node = freeNodeList;

  if (node == NULL)
  {
    dbExprNodeSegment* seg = new dbExprNodeSegment;
    seg->next = segmentList;
    segmentList = seg;
    node = (dbExprNode*)seg->buf;
    dbExprNode* free = NULL;

    for (int i = dbExprNodeSegment::allocationQuantum; --i != 0;)
    {
      node->next = free;
      free = node++;
    }

    freeNodeList = free;
  }
  else
  {
    freeNodeList = node->next;
  }

  return node;
}

void dbExprNodeAllocator::deallocate(dbExprNode* node)
{
  if (node != NULL)
  {
    node->next = freeNodeList;
    freeNodeList = node;
  }
}

void dbExprNodeAllocator::reset()
{
  dbExprNode* free = NULL;

  for (dbExprNodeSegment* seg = segmentList; seg != NULL; seg = seg->next)
  {
    dbExprNode* node = (dbExprNode*)seg->buf;

    for (int i = dbExprNodeSegment::allocationQuantum; --i >= 0;)
    {
      node->next = free;
      free = node++;
    }
  }

  freeNodeList = free;
}

dbExprNode::dbExprNode(dbExprNode* node)
{
  memcpy(this, node, sizeof(*this));

  for (int i = nodeOperands[cop]; --i >= 0;)
  {
    operand[i] = new dbExprNode(operand[i]);
  }

  if (cop == dbvmLoadStringConstant)
  {
    char* s = new char[strlen(svalue.str)+1];
    strcpy(s, svalue.str);
    svalue.str = s;
  }
}

dbExprNode::~dbExprNode()
{
  if (cop == dbvmLoadStringConstant)
  {
    delete[] svalue.str;
  }
  else
  {
    for (int i = nodeOperands[cop]; --i >= 0; )
    {
      delete operand[i];
    }
  }
}

int dbCompiler::scan()
{
  char ch;
  char *p, *q;
  int  i, n, value;
  char buf[maxStrLen+1];

  if (hasToken)
  {
    hasToken = false;
    return lex;
  }

nextElement:

  if (queryElement == NULL)
  {
    return tkn_eof;
  }

  if (queryElement->type != dbQueryElement::qExpression)
  {
    varType = queryElement->type;
    varPtr = queryElement->ptr;
    varRefTable = queryElement->ref;
    queryElement = queryElement->next;
    return tkn_var;
  }

  p = q = (char*)queryElement->ptr + currPos;

  do
  {
    ch = *p++;

    if (ch == '\n')
    {
      offsetWithinStatement = (char*)queryElement->ptr - p;
      firstPos = 0;
    }
  }
  while (isspace(byte(ch)));

  currPos += p - q;

  switch (ch)
  {

  case '\0':

    if ((queryElement = queryElement->next) == NULL)
    {
      return tkn_eof;
    }

    currPos = 0;
    goto nextElement;

  case '+':
    return tkn_add;

  case '-':

    if (*p == '-')
    {
      // ANSI comments
      q = p;

      do
      {
        p += 1;
      }
      while (*p != '\n' && *p != '\0');

      currPos += p - q;

      goto nextElement;
    }

    return tkn_sub;

  case '*':
    return tkn_mul;

  case '/':
    return tkn_div;

  case '.':
    return tkn_dot;

  case ',':
    return tkn_comma;

  case '(':
    return tkn_lpar;

  case ')':
    return tkn_rpar;

  case '[':
    return tkn_lbr;

  case ']':
    return tkn_rbr;

  case ':':
    return tkn_col;

  case '^':
    return tkn_power;

  case '<':

    if (*p == '=')
    {
      currPos += 1;
      return tkn_le;
    }
    else if (*p == '>')
    {
      currPos += 1;
      return tkn_ne;
    }

    return tkn_lt;

  case '>':

    if (*p == '=')
    {
      currPos += 1;
      return tkn_ge;
    }

    return tkn_gt;

  case '=':
    return tkn_eq;

  case '!':

    if (*p != '=')
    {
      error("Invalid token '!'");
    }

    currPos += 1;
    return tkn_ne;

  case '|':

    if (*p != '|')
    {
      error("Invalid token '|'");
    }

    currPos += 1;
    return tkn_add;

  case '\'':
    q = p;
    i = 0;

    while (true)
    {
      if (*p == '\'')
      {
        if (*++p != '\'')
        {
          break;
        }
      }
      else if (*p == '\0')
      {
        error("Unterminated character constant");
      }

      if (i == maxStrLen)
      {
        error("String constant too long");
      }

      buf[i++] = *p++;
    }

    buf[i++] = '\0';
    currPos += p - q;
    svalue.str = new char[i];
    strcpy(svalue.str, buf);
    svalue.len = i;
    return tkn_sconst;

  case '0':

  case '1':

  case '2':

  case '3':

  case '4':

  case '5':

  case '6':

  case '7':

  case '8':

  case '9':
    value = ch - '0';

    for (q = p; isdigit(*(byte*)p); p++)
    {
      value = value*10 + *p - '0';
    }

    if (*p == '.' || *p == 'e' || *p == 'E')
    {
      if (sscanf(q-1, "%lf%n", &fvalue, &n) != 1)
      {
        error("Bad floating point constant");
      }

      currPos += n - 1;
      return tkn_fconst;
    }
    else if (p - q >= 9)
    {
      if (sscanf(q-1, INT8_FORMAT "%n", &ivalue, &n) != 1)
      {
        error("Bad integer constant");
      }

      currPos += n - 1;
      return tkn_iconst;
    }
    else
    {
      currPos += p - q;
      ivalue = value;
      return tkn_iconst;
    }

  default:

    if (isalpha(ch) || ch == '$' || ch == '_')
    {
      i = 0;

      do
      {
        if (i == maxStrLen)
        {
          error("Name too long");
        }

        buf[i++] = ch;
        ch = *p++;
      }
      while (isalnum(ch) || ch == '$' || ch == '_');

      buf[i] = '\0';

      name = buf;

      currPos += i - 1;
    }
    else
    {
      error("Invalid symbol");
    }

    return dbSymbolTable::add
             (name, tkn_ident);
  }
}

dbExprNode* dbCompiler::disjunction()
{
  dbExprNode* left = conjunction();

  if (lex == tkn_or)
  {
    int pos = currPos;
    dbExprNode* right = disjunction();

    if (left->type == tpInteger && right->type == tpInteger)
    {
      left = new dbExprNode(dbvmOrInt, left, right);
    }
    else if (left->type == tpBoolean && right->type == tpBoolean)
    {
      left = new dbExprNode(dbvmOrBool, left, right);
    }
    else
    {
      error("Bad operands for OR operator", pos);
    }
  }

  return left;
}

dbExprNode* dbCompiler::conjunction()
{
  dbExprNode* left = comparison();

  if (lex == tkn_and)
  {
    int pos = currPos;
    dbExprNode* right = conjunction();

    if (left->type == tpInteger && right->type == tpInteger)
    {
      left = new dbExprNode(dbvmAndInt, left, right);
    }
    else if (left->type == tpBoolean && right->type == tpBoolean)
    {
      left = new dbExprNode(dbvmAndBool, left, right);
    }
    else
    {
      error("Bad operands for AND operator", pos);
    }
  }

  return left;
}

inline dbExprNode* int2real(dbExprNode* expr)
{
  if (expr->cop == dbvmLoadIntConstant)
  {
    expr->fvalue = (real8)expr->ivalue;
    expr->cop = dbvmLoadRealConstant;
    expr->type = tpReal;
  }
  else
  {
    expr = new dbExprNode(dbvmIntToReal, expr);
  }

  return expr;
}

int dbCompiler::compare(dbExprNode* expr, dbExprNode* list)
{
  int n = 1;

  if (list->operand[0] != NULL)
  {
    n = compare(expr, list->operand[0]);
    expr = new dbExprNode(expr);
  }

  dbExprNode* elem = list->operand[1];
  int cop = dbvmVoid;
  int rawBinarySize = 0;
  void* rawBinaryComparator = NULL;

  if (expr->type == tpInteger)
  {
    if (elem->type == tpReal)
    {
      expr = int2real(expr);
      cop = dbvmEqReal;
    }
    else if (elem->type == tpReference)
    {
      expr = new dbExprNode(dbvmIntToReference, expr);
      cop = dbvmEqReference;
    }
    else if (elem->type == tpInteger)
    {
      cop = dbvmEqInt;
    }
  }
  else if (expr->type == tpReal)
  {
    if (elem->type == tpReal)
    {
      cop = dbvmEqReal;
    }
    else if (elem->type == tpInteger)
    {
      cop = dbvmEqReal;
      elem = int2real(elem);
    }
  }
  else if (expr->type == tpString && elem->type == tpString)
  {
    cop = dbvmEqString;
  }
  else if (expr->type == tpReference && (elem->type == tpReference || elem->type == tpInteger))
  {
    if (elem->type == tpInteger)
    {
      elem = new dbExprNode(dbvmIntToReference, elem);
    }

    cop = dbvmEqReference;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久免费观看| 欧美一级二级三级蜜桃| 免费观看日韩av| 国产精品区一区二区三| 欧美高清一级片在线| 99久久久精品| 青青青伊人色综合久久| 亚洲精品视频在线观看网站| 精品久久一区二区三区| 欧美丝袜丝交足nylons图片| 成人午夜视频福利| 另类小说综合欧美亚洲| 亚洲一区二区三区影院| 国产精品国产三级国产aⅴ原创| 日韩三级精品电影久久久| 日本久久一区二区| 大尺度一区二区| 蜜臀av性久久久久蜜臀aⅴ| 亚洲国产精品久久久久秋霞影院| 国产精品水嫩水嫩| 久久午夜电影网| 日韩亚洲国产中文字幕欧美| 欧美色视频在线| 色婷婷精品大在线视频 | 视频在线观看91| 亚洲欧美日韩电影| 亚洲国产精品av| 久久久亚洲欧洲日产国码αv| 91精品免费在线| 欧美精品丝袜久久久中文字幕| 色婷婷国产精品| 色婷婷国产精品| 色婷婷亚洲精品| 欧美在线免费观看亚洲| 色综合久久综合网| 91麻豆免费在线观看| 99久久综合国产精品| 高清国产一区二区| 成人福利视频网站| 成人精品一区二区三区四区| 丁香激情综合五月| 91在线观看美女| 色综合天天综合在线视频| 91在线视频18| 欧洲精品在线观看| 欧美军同video69gay| 欧美日韩第一区日日骚| 3d成人h动漫网站入口| 制服丝袜亚洲色图| 精品久久久久久久久久久久包黑料| 日韩一级在线观看| 久久久久久夜精品精品免费| 国产日韩欧美综合一区| 中文字幕一区三区| 亚洲精品视频在线| 日韩高清不卡一区| 久久成人麻豆午夜电影| 国产精品一二三区| 91在线小视频| 欧美日免费三级在线| 日韩一区二区免费电影| 2022国产精品视频| 国产精品视频麻豆| 亚洲欧美精品午睡沙发| 偷拍日韩校园综合在线| 久久电影网站中文字幕| 播五月开心婷婷综合| 欧美三级资源在线| 欧美电视剧免费观看| 国产精品夫妻自拍| 亚洲成a人v欧美综合天堂下载 | 欧美tickling挠脚心丨vk| 久久久亚洲精品石原莉奈| 国产精品白丝在线| 日韩精品视频网| 欧美三级视频在线播放| 欧美日韩成人在线| 久久久久久久久久久久电影| 亚洲三级在线看| 美国十次综合导航| 97成人超碰视| 日韩精品中文字幕一区二区三区| 国产区在线观看成人精品 | 五月天激情综合网| 国产另类ts人妖一区二区| 91小视频在线免费看| 欧美一区中文字幕| 亚洲丝袜美腿综合| 久久99精品国产麻豆婷婷| 91免费视频网址| 精品成人a区在线观看| 亚洲精品免费在线观看| 国产一区二区免费看| 91官网在线观看| 国产欧美一区视频| 天天色综合天天| 91在线精品一区二区三区| 日韩欧美国产系列| 一区二区在线观看视频| 国产精品亚洲一区二区三区妖精 | 精品粉嫩aⅴ一区二区三区四区| 成人免费在线播放视频| 久久99精品久久只有精品| 欧美中文字幕不卡| 欧美—级在线免费片| 免费在线欧美视频| 欧美亚洲国产怡红院影院| 欧美经典一区二区| 精品综合久久久久久8888| 欧美性欧美巨大黑白大战| 国产日韩精品一区二区三区 | 国产精品一区二区三区四区| 欧美喷潮久久久xxxxx| 国产精品传媒入口麻豆| 国产精品一区二区你懂的| 日韩一区二区三区电影| 日韩激情视频在线观看| 91福利区一区二区三区| 成人欧美一区二区三区白人| 国产精品1区2区3区在线观看| 日韩午夜小视频| 亚洲不卡一区二区三区| 91麻豆国产在线观看| 中文字幕在线不卡国产视频| 国产乱人伦精品一区二区在线观看| 69堂国产成人免费视频| 日韩中文字幕一区二区三区| 色999日韩国产欧美一区二区| ...中文天堂在线一区| 成人黄色a**站在线观看| 国产欧美日韩在线看| 国产乱码精品一区二区三区忘忧草 | 欧美精品在线视频| 一区二区三区色| 色香蕉久久蜜桃| 一区二区高清免费观看影视大全 | 日韩欧美一区二区不卡| 视频在线观看一区二区三区| 欧美一区欧美二区| 麻豆91精品91久久久的内涵| 日韩一级黄色片| 激情深爱一区二区| 久久久99精品免费观看不卡| 国产精品69久久久久水密桃| 国产女主播一区| 99久久综合色| 风间由美一区二区av101 | 欧美va亚洲va| 国产久卡久卡久卡久卡视频精品| 久久久噜噜噜久噜久久综合| 国产成人亚洲精品青草天美| 国产精品久久久久aaaa樱花| 91色porny在线视频| 亚洲国产视频直播| 欧美一区二区三区视频在线观看| 久久99精品国产91久久来源| 亚洲国产精品av| 91国偷自产一区二区三区成为亚洲经典 | 3atv在线一区二区三区| 精彩视频一区二区| 国产精品污污网站在线观看| 91在线观看高清| 日本中文一区二区三区| 久久夜色精品国产噜噜av| 97久久超碰国产精品| 日韩精品一二三四| 国产亚洲欧美激情| 色88888久久久久久影院按摩| 日本亚洲视频在线| 亚洲国产高清aⅴ视频| 欧美这里有精品| 国内精品伊人久久久久av影院| 亚洲欧洲日韩综合一区二区| 欧美日韩另类一区| 国产一区二区三区高清播放| 亚洲乱码国产乱码精品精98午夜| 欧美一区二区三区免费在线看| 国产盗摄一区二区三区| 亚洲一区二区综合| 精品国产免费人成在线观看| 色综合网色综合| 精品一区二区三区蜜桃| 亚洲三级电影网站| 欧美大片一区二区三区| 91在线观看美女| 国产一区二区精品久久91| 亚洲影院免费观看| 久久久久亚洲综合| 欧美日韩成人一区二区| eeuss鲁片一区二区三区| 奇米888四色在线精品| 中文字幕欧美一| 精品sm捆绑视频| 欧美日韩三级一区| 成人av网在线| 精品在线一区二区三区| 亚洲国产一区二区三区青草影视| 国产精品久久久久影院亚瑟| 国产日韩欧美综合在线| 国产真实乱对白精彩久久|