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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? parser.cpp

?? 一個類c++語言解釋器
?? CPP
字號:
// Recursive descent parser for integer expressions.
//
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include "chsh.h"

using namespace std;

// Keyword lookup table.
// Keywords must be entered lowercase.
struct commands {
  char command[20];
  token_ireps tok;
} com_table[] = {
  "if", IF,
  "else", ELSE,
  "for", FOR,
  "do", DO,
  "while", WHILE,
  "char", CHAR,
  "int", INT,
  "return", RETURN,
  "switch", SWITCH,
  "break", BREAK,
  "case", CASE,
  "cout", COUT,
  "cin", CIN,
  "", END  // mark end of table
};

// This structure links a library function name
// with a pointer to that function.
struct intern_func_type {
  char *f_name; // function name
  int (*p)();   // pointer to the function
} intern_func[] = {
  "getchar", call_getchar,
  "putchar", call_putchar,
  "abs", call_abs,
  "rand", call_rand,
  "", 0  // null terminate the list
};

// Entry point into parser.
void eval_exp(int &value)
{
  get_token();

  if(!*token) {
    throw InterpExc(NO_EXP);
  }

  if(*token == ';') {
    value = 0; // empty expression
    return;
  }

  eval_exp0(value);

  putback(); // return last token read to input stream
}

// Process an assignment expression.
void eval_exp0(int &value)
{
  // temp holds name of var receiving the assignment.
  char temp[MAX_ID_LEN+1];

  tok_types temp_tok;

  if(token_type == IDENTIFIER) {
    if(is_var(token)) { // if a var, see if assignment
      strcpy(temp, token);
      temp_tok = token_type;
      get_token();
      if(*token == '=') { // is an assignment
        get_token();
        eval_exp0(value); // get value to assign
        assign_var(temp, value); // assign the value
        return;
      }
      else { // not an assignment
        putback(); // restore original token
        strcpy(token, temp);
        token_type = temp_tok;
      }
    }
  }
  eval_exp1(value);
}

// Process relational operators.
void eval_exp1(int &value)
{
  int partial_value;
  char op;
  char relops[] = {
    LT, LE, GT, GE, EQ, NE, 0
  };

  eval_exp2(value);

  op = *token;
  if(strchr(relops, op)) {
    get_token();
    eval_exp2(partial_value);

    switch(op) { // perform the relational operation
      case LT:
        value = value < partial_value;
        break;
      case LE:
        value = value <= partial_value;
        break;
      case GT:
        value = value > partial_value;
        break;
      case GE:
        value = value >= partial_value;
        break;
      case EQ:
        value = value == partial_value;
        break;
      case NE:
        value = value != partial_value;
        break;
    }
  }
}

// Add or subtract two terms.
void eval_exp2(int &value)
{
  char  op;
  int partial_value;
  char okops[] = {
    '(', INC, DEC, '-', '+', 0
  };

  eval_exp3(value);

  while((op = *token) == '+' || op == '-') {
    get_token();

    if(token_type == DELIMITER &&
       !strchr(okops, *token))
         throw InterpExc(SYNTAX);

    eval_exp3(partial_value);

    switch(op) { // add or subtract
      case '-':
        value = value - partial_value;
        break;
      case '+':
        value = value + partial_value;
        break;
    }
  }
}

// Multiply or divide two factors.
void eval_exp3(int &value)
{
  char  op;
  int partial_value, t;
  char okops[] = {
    '(', INC, DEC, '-', '+', 0
  };

  eval_exp4(value);

  while((op = *token) == '*' || op == '/'
         || op == '%') {
    get_token();

    if(token_type == DELIMITER &&
       !strchr(okops, *token))
         throw InterpExc(SYNTAX);

    eval_exp4(partial_value);

    switch(op) { // mul, div, or modulus
      case '*':
        value = value * partial_value;
        break;
      case '/':
        if(partial_value == 0)
          throw InterpExc(DIV_BY_ZERO);
        value = (value) / partial_value;
        break;
      case '%':
        t = (value) / partial_value;
        value = value - (t * partial_value);
        break;
    }
  }
}

// Is a unary +, -, ++, or --.
void eval_exp4(int &value)
{
  char  op;
  char temp;

  op = '\0';
  if(*token == '+' || *token == '-' ||
     *token == INC || *token == DEC)
  {
    temp = *token;
    op = *token;
    get_token();
    if(temp == INC)
      assign_var(token, find_var(token)+1);
    if(temp == DEC)
      assign_var(token, find_var(token)-1);
  }

  eval_exp5(value);
  if(op == '-') value = -(value);
}

// Process parenthesized expression.
void eval_exp5(int &value)
{

  if((*token == '(')) {
    get_token();

    eval_exp0(value); // get subexpression

    if(*token != ')')
      throw InterpExc(PAREN_EXPECTED);
    get_token();
  }
  else
    atom(value);
}

// Find value of number, variable, or function.
void atom(int &value)
{
  int i;
  char temp[MAX_ID_LEN+1];

  switch(token_type) {
    case IDENTIFIER:
      i = internal_func(token);
      if(i != -1) {
        // Call "standard library" function.
        value = (*intern_func[i].p)();
      }
      else if(find_func(token)) {
        // Call programmer-created function.
        call();
        value = ret_value;
      }
      else {
        value = find_var(token); // get var's value
        strcpy(temp, token); // save variable name

        // Check for ++ or --.
        get_token();
        if(*token == INC || *token == DEC) {
          if(*token == INC)
            assign_var(temp, find_var(temp)+1);
          else
            assign_var(temp, find_var(temp)-1);
        } else putback();
      }

      get_token();
      return;
    case NUMBER: // is numeric constant
      value = atoi(token);
      get_token();

      return;
    case DELIMITER: // see if character constant
      if(*token == '\'') {
        value = *prog;
        prog++;
        if(*prog!='\'')
          throw InterpExc(QUOTE_EXPECTED);

        prog++;
        get_token();

        return ;
      }
      if(*token==')') return; // process empty expression
      else throw InterpExc(SYNTAX);  // otherwise, syntax error
    default:
      throw InterpExc(SYNTAX); // syntax error
  }
}

// Display an error message.
void sntx_err(error_msg error)
{
  char *p, *temp;
  int linecount = 0;

  static char *e[]= {
    "Syntax error",
    "No expression present",
    "Not a variable",
    "Duplicate variable name",
    "Duplicate function name",
    "Semicolon expected",
    "Unbalanced braces",
    "Function undefined",
    "Type specifier expected",
    "Return without call",
    "Parentheses expected",
    "While expected",
    "Closing quote expected",
    "Division by zero",
    "{ expected (control statements must use blocks)",
    "Colon expected"
  };

  // Display error and line number.
  cout << "\n" << e[error];
  p = p_buf;
  while(p != prog) { // find line number of error
    p++;
    if(*p == '\r') {
      linecount++;
    }
  }
  cout << " in line " << linecount << endl;

  temp = p;
  while(p > p_buf && *p != '\n') p--;

  // Display offending line.
  while(p <= temp)
    cout << *p++;

  cout << endl;
}

// Get a token.
tok_types get_token()
{

  char *temp;

  token_type = UNDEFTT; tok = UNDEFTOK;

  temp = token;
  *temp = '\0';

  // Skip over white space.
  while(isspace(*prog) && *prog) ++prog;

  // Skip over newline.
  while(*prog == '\r') {
    ++prog;
    ++prog;
    // Again, skip over white space.
    while(isspace(*prog) && *prog) ++prog;
  }

  // Check for end of program.
  if(*prog == '\0') {
    *token = '\0';
    tok = END;
    return (token_type = DELIMITER);
  }

  // Check for block delimiters.
  if(strchr("{}", *prog)) {
    *temp = *prog;
    temp++;
    *temp = '\0';
    prog++;
    return (token_type = BLOCK);
  }

  // Look for comments.
  if(*prog == '/')
    if(*(prog+1) == '*') { // is a /* comment
      prog += 2;
      do { // find end of comment
        while(*prog != '*') prog++;
        prog++;
      } while (*prog != '/');
      prog++;
      return (token_type = DELIMITER);
    } else if(*(prog+1) == '/') { // is a // comment
      prog += 2;
      // Find end of comment.
      while(*prog != '\r' && *prog != '\0') prog++;
      if(*prog == '\r') prog +=2;
      return (token_type = DELIMITER);
    }

  // Check for double-ops.
  if(strchr("!<>=+-", *prog)) {
    switch(*prog) {
      case '=':
        if(*(prog+1) == '=') {
          prog++; prog++;
          *temp = EQ;
          temp++; *temp = EQ; temp++;
          *temp = '\0';
        }
        break;
      case '!':
        if(*(prog+1) == '=') {
          prog++; prog++;
          *temp = NE;
          temp++; *temp = NE; temp++;
          *temp = '\0';
        }
        break;
      case '<':
        if(*(prog+1) == '=') {
          prog++; prog++;
          *temp = LE; temp++; *temp = LE;
        }
        else if(*(prog+1) == '<') {
          prog++; prog++;
          *temp = LS; temp++; *temp = LS;
        }
        else {
          prog++;
          *temp = LT;
        }
        temp++;
        *temp = '\0';
        break;
      case '>':
        if(*(prog+1) == '=') {
          prog++; prog++;
          *temp = GE; temp++; *temp = GE;
        } else if(*(prog+1) == '>') {
          prog++; prog++;
          *temp = RS; temp++; *temp = RS;
        }
        else {
          prog++;
          *temp = GT;
        }
        temp++;
        *temp = '\0';
        break;
      case '+':
        if(*(prog+1) == '+') {
          prog++; prog++;
          *temp = INC; temp++; *temp = INC;
          temp++;
          *temp = '\0';
        }
        break;
      case '-':
        if(*(prog+1) == '-') {
          prog++; prog++;
          *temp = DEC; temp++; *temp = DEC;
          temp++;
          *temp = '\0';
        }
        break;
    }

    if(*token) return(token_type = DELIMITER);
  }

  // Check for other delimiters.
  if(strchr("+-*^/%=;:(),'", *prog)) {
    *temp = *prog;
    prog++;
    temp++;
    *temp = '\0';
    return (token_type = DELIMITER);
  }

  // Read a quoted string.
  if(*prog == '"') {
    prog++;
    while(*prog != '"' && *prog != '\r' && *prog) {
      // Check for \n escape sequence.
      if(*prog == '\\') {
        if(*(prog+1) == 'n') {
          prog++;
          *temp++ = '\n';
        }
      }
      else if((temp - token) < MAX_T_LEN)
        *temp++ = *prog;

      prog++;
    }
    if(*prog == '\r' || *prog == 0)
      throw InterpExc(SYNTAX);
    prog++; *temp = '\0';
    return (token_type = STRING);
  }

  // Read an integer number.
  if(isdigit(*prog)) {
    while(!isdelim(*prog)) {
      if((temp - token) < MAX_ID_LEN)
        *temp++ = *prog;
      prog++;
    }
    *temp = '\0';
    return (token_type = NUMBER);
  }

  // Read identifier or keyword.
  if(isalpha(*prog)) {
    while(!isdelim(*prog)) {
      if((temp - token) < MAX_ID_LEN)
        *temp++ = *prog;
      prog++;
    }
    token_type = TEMP;
  }

  *temp = '\0';

  // Determine if token is a keyword or identifier.
  if(token_type == TEMP) {
    tok = look_up(token); // convert to internal form
    if(tok) token_type = KEYWORD; // is a keyword
    else token_type = IDENTIFIER;
  }

  // Check for unidentified character in file.
  if(token_type == UNDEFTT)
    throw InterpExc(SYNTAX);

  return token_type;
}

// Return a token to input stream.
void putback()
{
  char *t;

  t = token;
  for(; *t; t++) prog--;
}

// Look up a token's internal representation in the
// token table.
token_ireps look_up(char *s)
{
  int i;
  char *p;

  // Convert to lowercase.
  p = s;
  while(*p) { *p = tolower(*p); p++; }

  // See if token is in table.
  for(i=0; *com_table[i].command; i++) {
    if(!strcmp(com_table[i].command, s))
      return com_table[i].tok;
  }

  return UNDEFTOK; // unknown command
}

// Return index of internal library function or -1 if
// not found.
int internal_func(char *s)
{
  int i;

  for(i=0; intern_func[i].f_name[0]; i++) {
    if(!strcmp(intern_func[i].f_name, s))  return i;
  }
  return -1;
}

// Return true if c is a delimiter.
bool isdelim(char c)
{
  if(strchr(" !:;,+-<>'/*%^=()", c) || c == 9 ||
     c == '\r' || c == 0) return true;
  return false;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区欧美日韩| 老司机精品视频一区二区三区| 91精品午夜视频| 不卡高清视频专区| 日本不卡免费在线视频| 中文字幕一区二区三区乱码在线| 久久久久久久久久久久电影 | jizz一区二区| 美腿丝袜亚洲色图| 亚洲一区二区视频| 国产精品私人自拍| 日韩欧美一二三区| 91色九色蝌蚪| 国产一区二区不卡老阿姨| 亚洲18影院在线观看| 中文字幕制服丝袜成人av| 欧美一区二区精品在线| 波多野结衣中文字幕一区二区三区| 日韩中文字幕一区二区三区| 亚洲欧美日韩国产综合在线| 中文在线一区二区| 日韩女优av电影在线观看| 欧美性色欧美a在线播放| 成人激情视频网站| 国产福利一区二区三区| 麻豆一区二区三| 亚洲激情图片小说视频| 国产精品成人一区二区三区夜夜夜 | 欧美日韩久久不卡| 久久影视一区二区| 精品剧情在线观看| 91精品国产色综合久久不卡电影 | 亚洲精品欧美在线| 国产精品国产三级国产普通话99 | 亚洲制服欧美中文字幕中文字幕| 欧美国产欧美综合| 国产日韩欧美精品电影三级在线| 久久精品欧美日韩精品| 亚洲欧美乱综合| 国产成人在线电影| 色综合网色综合| 国产精品一级片| 视频一区欧美精品| 三级影片在线观看欧美日韩一区二区| 一片黄亚洲嫩模| 日本aⅴ免费视频一区二区三区| 亚洲成av人片一区二区| 日本亚洲天堂网| 国产v日产∨综合v精品视频| 国产91精品一区二区| 色天天综合久久久久综合片| 欧美日韩中文字幕一区二区| 91精品国产高清一区二区三区| 欧美一区二区三区免费观看视频 | 久久久精品tv| 亚洲色图第一区| 国产精品一区二区无线| 国产精品自在在线| 91福利社在线观看| 777午夜精品视频在线播放| 日韩一级黄色片| 亚洲国产成人午夜在线一区| 亚洲午夜三级在线| 狠狠色狠狠色综合系列| 色婷婷综合五月| 久久综合精品国产一区二区三区| 中文字幕欧美激情一区| 男女男精品视频| 91免费国产在线观看| 精品88久久久久88久久久| 1024成人网| 蜜臀av性久久久久蜜臀aⅴ流畅| 91亚洲国产成人精品一区二区三| 在线播放亚洲一区| 国产精品色在线观看| 日韩精品电影在线观看| 国产黄人亚洲片| 欧美日韩黄色一区二区| 中文字幕免费在线观看视频一区| 亚洲成年人网站在线观看| 国产成人免费在线视频| 欧美一区永久视频免费观看| 综合av第一页| 国内一区二区视频| 欧美情侣在线播放| 国产精品久久久久一区| 国产综合色视频| 欧美大胆一级视频| 亚洲一级二级在线| 成人91在线观看| 欧美激情在线免费观看| 久久99精品国产.久久久久久 | 精品国产91乱码一区二区三区| 裸体歌舞表演一区二区| 欧美性猛交一区二区三区精品| 18欧美亚洲精品| 一本色道综合亚洲| 国产精品色哟哟| 成人av电影在线播放| 日本一区二区三区在线不卡| 国内精品国产成人国产三级粉色| 欧美特级限制片免费在线观看| 亚洲综合在线电影| 欧美性受xxxx| 亚洲成人一区在线| 欧美巨大另类极品videosbest| 亚洲一区二区三区激情| 欧美日韩国产美女| 日韩成人av影视| 欧美v日韩v国产v| 国产乱人伦偷精品视频不卡| 国产视频一区在线观看| 国产精品羞羞答答xxdd| 中文字幕一区二区三区不卡| 色国产精品一区在线观看| 亚洲高清免费观看| 亚洲精品在线免费播放| 91一区在线观看| 五月开心婷婷久久| 精品福利一二区| 99在线精品视频| 日本一道高清亚洲日美韩| 日韩一区二区在线观看| 久久电影网站中文字幕| 中文字幕在线观看不卡视频| 国产成a人亚洲| 亚洲欧美色图小说| 欧美日韩国产天堂| 国产成人精品免费| 天堂av在线一区| 亚洲国产欧美在线| 51精品国自产在线| 成人动漫精品一区二区| 婷婷综合久久一区二区三区| 久久久777精品电影网影网| 成人三级伦理片| 美女免费视频一区二区| |精品福利一区二区三区| 欧美日韩久久一区| 精品一区二区三区在线播放视频| 国产欧美日本一区视频| 一本久道久久综合中文字幕| 视频一区二区不卡| 国产精品污www在线观看| 欧美日韩精品欧美日韩精品一 | 久久先锋影音av鲁色资源网| 91在线一区二区| 国产乱国产乱300精品| 自拍偷在线精品自拍偷无码专区| 欧美高清一级片在线| 色噜噜狠狠色综合欧洲selulu| 日本一区中文字幕| 亚洲色图都市小说| 国产精品久久久99| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | av一二三不卡影片| 宅男噜噜噜66一区二区66| 欧美做爰猛烈大尺度电影无法无天| 国产成人精品午夜视频免费| 黄一区二区三区| 国产在线视视频有精品| 精品一区二区在线看| 亚洲精品五月天| 亚洲精品乱码久久久久久久久 | 欧美videos大乳护士334| 91精品国产综合久久久久久漫画 | 久久久精品黄色| 亚洲精品在线免费播放| 欧美一区二区视频在线观看2020| 精品视频全国免费看| 一本色道综合亚洲| 91女神在线视频| 欧美日韩在线综合| 欧美日韩视频在线观看一区二区三区| 成人国产精品免费| 色老综合老女人久久久| 欧美系列日韩一区| 欧美成人video| 欧美国产在线观看| 亚洲制服欧美中文字幕中文字幕| 日韩中文字幕麻豆| 国产精品香蕉一区二区三区| 高清不卡在线观看av| 91久久人澡人人添人人爽欧美| 欧美亚洲国产怡红院影院| 精品久久国产97色综合| 国产欧美日韩精品在线| 亚洲精品伦理在线| 在线一区二区观看| 欧美美女一区二区在线观看| 欧美日韩成人一区| 国产精品入口麻豆九色| 五月综合激情网| 国产一区二三区| 99久久免费视频.com| 欧美性高清videossexo| 精品国产免费一区二区三区香蕉| 中文字幕欧美日韩一区| 亚洲一区二区偷拍精品| 久久99精品一区二区三区|