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

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

?? cexp.y

?? 這是完整的gcc源代碼
?? Y
字號:
/* Parse C expressions for CCCP.   Copyright (C) 1987 Free Software Foundation.This program is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as published by theFree Software Foundation; either version 1, or (at your option) anylater version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA. In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve what you give them.   Help stamp out software-hoarding! Adapted from expread.y of GDB by Paul Rubin, July 1986./* Parse a C expression from text in a string  */   %{#include "config.h"#include <setjmp.h>/* #define YYDEBUG 1 */  int yylex ();  void yyerror ();  int expression_value;  static jmp_buf parse_return_error;  /* some external tables of character types */  extern unsigned char is_idstart[], is_idchar[];#ifndef CHAR_TYPE_SIZE#define CHAR_TYPE_SIZE BITS_PER_UNIT#endif%}%union {  struct constant {long value; int unsignedp;} integer;  int voidval;  char *sval;}%type <integer> exp exp1 start%token <integer> INT CHAR%token <sval> NAME%token <integer> ERROR%right '?' ':'%left ','%left OR%left AND%left '|'%left '^'%left '&'%left EQUAL NOTEQUAL%left '<' '>' LEQ GEQ%left LSH RSH%left '+' '-'%left '*' '/' '%'%right UNARY/* %expect 40 */%%start   :	exp1		{ expression_value = $1.value; }	;/* Expressions, including the comma operator.  */exp1	:	exp	|	exp1 ',' exp			{ $$ = $3; }	;/* Expressions, not including the comma operator.  */exp	:	'-' exp    %prec UNARY			{ $$.value = - $2.value;			  $$.unsignedp = $2.unsignedp; }	|	'!' exp    %prec UNARY			{ $$.value = ! $2.value;			  $$.unsignedp = 0; }	|	'+' exp    %prec UNARY			{ $$ = $2; }	|	'~' exp    %prec UNARY			{ $$.value = ~ $2.value;			  $$.unsignedp = $2.unsignedp; }	|	'(' exp1 ')'			{ $$ = $2; }	;/* Binary operators in order of decreasing precedence.  */exp	:	exp '*' exp			{ $$.unsignedp = $1.unsignedp || $3.unsignedp;			  if ($$.unsignedp)			    $$.value = (unsigned) $1.value * $3.value;			  else			    $$.value = $1.value * $3.value; }	|	exp '/' exp			{ if ($3.value == 0)			    {			      error ("division by zero in #if");			      $3.value = 1;			    }			  $$.unsignedp = $1.unsignedp || $3.unsignedp;			  if ($$.unsignedp)			    $$.value = (unsigned) $1.value / $3.value;			  else			    $$.value = $1.value / $3.value; }	|	exp '%' exp			{ if ($3.value == 0)			    {			      error ("division by zero in #if");			      $3.value = 1;			    }			  $$.unsignedp = $1.unsignedp || $3.unsignedp;			  if ($$.unsignedp)			    $$.value = (unsigned) $1.value % $3.value;			  else			    $$.value = $1.value % $3.value; }	|	exp '+' exp			{ $$.value = $1.value + $3.value;			  $$.unsignedp = $1.unsignedp || $3.unsignedp; }	|	exp '-' exp			{ $$.value = $1.value - $3.value;			  $$.unsignedp = $1.unsignedp || $3.unsignedp; }	|	exp LSH exp			{ $$.unsignedp = $1.unsignedp;			  if ($$.unsignedp)			    $$.value = (unsigned) $1.value << $3.value;			  else			    $$.value = $1.value << $3.value; }	|	exp RSH exp			{ $$.unsignedp = $1.unsignedp;			  if ($$.unsignedp)			    $$.value = (unsigned) $1.value >> $3.value;			  else			    $$.value = $1.value >> $3.value; }	|	exp EQUAL exp			{ $$.value = ($1.value == $3.value);			  $$.unsignedp = 0; }	|	exp NOTEQUAL exp			{ $$.value = ($1.value != $3.value);			  $$.unsignedp = 0; }	|	exp LEQ exp			{ $$.unsignedp = 0;			  if ($1.unsignedp || $3.unsignedp)			    $$.value = (unsigned) $1.value <= $3.value;			  else			    $$.value = $1.value <= $3.value; }	|	exp GEQ exp			{ $$.unsignedp = 0;			  if ($1.unsignedp || $3.unsignedp)			    $$.value = (unsigned) $1.value >= $3.value;			  else			    $$.value = $1.value >= $3.value; }	|	exp '<' exp			{ $$.unsignedp = 0;			  if ($1.unsignedp || $3.unsignedp)			    $$.value = (unsigned) $1.value < $3.value;			  else			    $$.value = $1.value < $3.value; }	|	exp '>' exp			{ $$.unsignedp = 0;			  if ($1.unsignedp || $3.unsignedp)			    $$.value = (unsigned) $1.value > $3.value;			  else			    $$.value = $1.value > $3.value; }	|	exp '&' exp			{ $$.value = $1.value & $3.value;			  $$.unsignedp = $1.unsignedp || $3.unsignedp; }	|	exp '^' exp			{ $$.value = $1.value ^ $3.value;			  $$.unsignedp = $1.unsignedp || $3.unsignedp; }	|	exp '|' exp			{ $$.value = $1.value | $3.value;			  $$.unsignedp = $1.unsignedp || $3.unsignedp; }	|	exp AND exp			{ $$.value = ($1.value && $3.value);			  $$.unsignedp = 0; }	|	exp OR exp			{ $$.value = ($1.value || $3.value);			  $$.unsignedp = 0; }	|	exp '?' exp ':' exp			{ $$.value = $1.value ? $3.value : $5.value;			  $$.unsignedp = $3.unsignedp || $5.unsignedp; }	|	INT			{ $$ = yylval.integer; }	|	CHAR			{ $$ = yylval.integer; }	|	NAME			{ $$.value = 0;			  $$.unsignedp = 0; }	;%%/* During parsing of a C expression, the pointer to the next character   is in this variable.  */static char *lexptr;/* Take care of parsing a number (anything that starts with a digit).   Set yylval and return the token type; update lexptr.   LEN is the number of characters in it.  *//* maybe needs to actually deal with floating point numbers */intparse_number (olen)     int olen;{  register char *p = lexptr;  register long n = 0;  register int c;  register int base = 10;  register int len = olen;  for (c = 0; c < len; c++)    if (p[c] == '.') {      /* It's a float since it contains a point.  */      yyerror ("floating point numbers not allowed in #if expressions");      return ERROR;    }  yylval.integer.unsignedp = 0;  if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {    p += 2;    base = 16;    len -= 2;  }  else if (*p == '0')    base = 8;  while (len > 0) {    c = *p++;    len--;    if (c >= 'A' && c <= 'Z') c += 'a' - 'A';    if (c >= '0' && c <= '9') {      n *= base;      n += c - '0';    } else if (base == 16 && c >= 'a' && c <= 'f') {      n *= base;      n += c - 'a' + 10;    } else {      /* `l' means long, and `u' means unsigned.  */      while (1) {	if (c == 'l' || c == 'L')	  ;	else if (c == 'u' || c == 'U')	  yylval.integer.unsignedp = 1;	else	  break;	if (len == 0)	  break;	c = *p++;	len--;      }      /* Don't look for any more digits after the suffixes.  */      break;    }  }  if (len != 0) {    yyerror ("Invalid number in #if expression");    return ERROR;  }  /* If too big to be signed, consider it unsigned.  */  if (n < 0)    yylval.integer.unsignedp = 1;  lexptr = p;  yylval.integer.value = n;  return INT;}struct token {  char *operator;  int token;};#ifndef NULL#define NULL 0#endifstatic struct token tokentab2[] = {  {"&&", AND},  {"||", OR},  {"<<", LSH},  {">>", RSH},  {"==", EQUAL},  {"!=", NOTEQUAL},  {"<=", LEQ},  {">=", GEQ},  {NULL, ERROR}};/* Read one token, getting characters through lexptr.  */intyylex (){  register int c;  register int namelen;  register char *tokstart;  register struct token *toktab; retry:  tokstart = lexptr;  c = *tokstart;  /* See if it is a special token of length 2.  */  for (toktab = tokentab2; toktab->operator != NULL; toktab++)    if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) {      lexptr += 2;      return toktab->token;    }  switch (c) {  case 0:    return 0;      case ' ':  case '\t':  case '\r':  case '\n':    lexptr++;    goto retry;      case '\'':    lexptr++;    c = *lexptr++;    if (c == '\\')      c = parse_escape (&lexptr);    /* Sign-extend the constant if chars are signed on target machine.  */    {      if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1)	  || ((c >> (CHAR_TYPE_SIZE - 1)) & 1) == 0)	yylval.integer.value = c & ((1 << CHAR_TYPE_SIZE) - 1);      else	yylval.integer.value = c | ~((1 << CHAR_TYPE_SIZE) - 1);    }    yylval.integer.unsignedp = 0;    c = *lexptr++;    if (c != '\'') {      yyerror ("Invalid character constant in #if");      return ERROR;    }        return CHAR;    /* some of these chars are invalid in constant expressions;       maybe do something about them later */  case '/':  case '+':  case '-':  case '*':  case '%':  case '|':  case '&':  case '^':  case '~':  case '!':  case '@':  case '<':  case '>':  case '(':  case ')':  case '[':  case ']':  case '.':  case '?':  case ':':  case '=':  case '{':  case '}':  case ',':    lexptr++;    return c;      case '"':    yyerror ("double quoted strings not allowed in #if expressions");    return ERROR;  }  if (c >= '0' && c <= '9') {    /* It's a number */    for (namelen = 0;	 c = tokstart[namelen], is_idchar[c] || c == '.'; 	 namelen++)      ;    return parse_number (namelen);  }    if (!is_idstart[c]) {    yyerror ("Invalid token in expression");    return ERROR;  }    /* It is a name.  See how long it is.  */    for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++)    ;    lexptr += namelen;  return NAME;}/* Parse a C escape sequence.  STRING_PTR points to a variable   containing a pointer to the string to parse.  That pointer   is updated past the characters we use.  The value of the   escape sequence is returned.   A negative value means the sequence \ newline was seen,   which is supposed to be equivalent to nothing at all.   If \ is followed by a null character, we return a negative   value and leave the string pointer pointing at the null character.   If \ is followed by 000, we return 0 and leave the string pointer   after the zeros.  A value of 0 does not mean end of string.  */intparse_escape (string_ptr)     char **string_ptr;{  register int c = *(*string_ptr)++;  switch (c)    {    case 'a':      return TARGET_BELL;    case 'b':      return TARGET_BS;    case 'e':      return 033;    case 'f':      return TARGET_FF;    case 'n':      return TARGET_NEWLINE;    case 'r':      return TARGET_CR;    case 't':      return TARGET_TAB;    case 'v':      return TARGET_VT;    case '\n':      return -2;    case 0:      (*string_ptr)--;      return 0;    case '^':      c = *(*string_ptr)++;      if (c == '\\')	c = parse_escape (string_ptr);      if (c == '?')	return 0177;      return (c & 0200) | (c & 037);          case '0':    case '1':    case '2':    case '3':    case '4':    case '5':    case '6':    case '7':      {	register int i = c - '0';	register int count = 0;	while (++count < 3)	  {	    c = *(*string_ptr)++;	    if (c >= '0' && c <= '7')	      i = (i << 3) + c - '0';	    else	      {		(*string_ptr)--;		break;	      }	  }	if ((i & ~((1 << CHAR_TYPE_SIZE) - 1)) != 0)	  {	    i &= (1 << CHAR_TYPE_SIZE) - 1;	    warning ("octal character constant does not fit in a byte");	  }	return i;      }    case 'x':      {	register int i = 0;	register int count = 0;	for (;;)	  {	    c = *(*string_ptr)++;	    if (c >= '0' && c <= '9')	      i = (i << 4) + c - '0';	    else if (c >= 'a' && c <= 'f')	      i = (i << 4) + c - 'a' + 10;	    else if (c >= 'A' && c <= 'F')	      i = (i << 4) + c - 'A' + 10;	    else	      {		(*string_ptr)--;		break;	      }	  }	if ((i & ~((1 << BITS_PER_UNIT) - 1)) != 0)	  {	    i &= (1 << BITS_PER_UNIT) - 1;	    warning ("hex character constant does not fit in a byte");	  }	return i;      }    default:      return c;    }}voidyyerror (s)     char *s;{  error (s);  longjmp (parse_return_error, 1);}/* This page contains the entry point to this file.  *//* Parse STRING as an expression, and complain if this fails   to use up all of the contents of STRING.  *//* We do not support C comments.  They should be removed before   this function is called.  */intparse_c_expression (string)     char *string;{  lexptr = string;    if (lexptr == 0 || *lexptr == 0) {    error ("empty #if expression");    return 0;			/* don't include the #if group */  }  /* if there is some sort of scanning error, just return 0 and assume     the parsing routine has printed an error message somewhere.     there is surely a better thing to do than this.     */  if (setjmp (parse_return_error))    return 0;  if (yyparse ())    return 0;			/* actually this is never reached				   the way things stand. */  if (*lexptr)    error ("Junk after end of expression.");  return expression_value;	/* set by yyparse () */}#ifdef TEST_EXP_READER/* main program, for testing purposes. */main (){  int n, c;  char buf[1024];  extern int yydebug;/*  yydebug = 1;*/  initialize_random_junk ();  for (;;) {    printf ("enter expression: ");    n = 0;    while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF)      n++;    if (buf[n] == EOF)      break;    buf[n] = '\0';    printf ("parser returned %d\n", parse_c_expression (buf));  }}/* table to tell if char can be part of a C identifier. */unsigned char is_idchar[256];/* table to tell if char can be first char of a c identifier. */unsigned char is_idstart[256];/* table to tell if c is horizontal space.  isspace () thinks that   newline is space; this is not a good idea for this program. */char is_hor_space[256];/* * initialize random junk in the hash table and maybe other places */initialize_random_junk (){  register int i;  /*   * Set up is_idchar and is_idstart tables.  These should be   * faster than saying (is_alpha (c) || c == '_'), etc.   * Must do set up these things before calling any routines tthat   * refer to them.   */  for (i = 'a'; i <= 'z'; i++) {    ++is_idchar[i - 'a' + 'A'];    ++is_idchar[i];    ++is_idstart[i - 'a' + 'A'];    ++is_idstart[i];  }  for (i = '0'; i <= '9'; i++)    ++is_idchar[i];  ++is_idchar['_'];  ++is_idstart['_'];#if DOLLARS_IN_IDENTIFIERS  ++is_idchar['$'];  ++is_idstart['$'];#endif  /* horizontal space table */  ++is_hor_space[' '];  ++is_hor_space['\t'];}error (msg){  printf ("error: %s\n", msg);}warning (msg){  printf ("warning: %s\n", msg);}struct hashnode *lookup (name, len, hash)     char *name;     int len;     int hash;{  return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1);}#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
懂色av一区二区夜夜嗨| 国产mv日韩mv欧美| 欧美成人精品3d动漫h| 国产精品综合视频| 亚洲在线成人精品| 久久久www成人免费毛片麻豆 | 欧美日本韩国一区| 国产一区不卡精品| 图片区小说区国产精品视频| 中文字幕一区二区三区四区不卡| 99热精品国产| 国产一区二三区| 日韩二区三区在线观看| 亚洲免费av在线| 国产精品天干天干在观线| 91精品国产色综合久久不卡蜜臀| 男女视频一区二区| 亚洲欧美激情插| 日本一区二区三区国色天香| 欧美va在线播放| 69p69国产精品| 欧美性色综合网| 91视视频在线观看入口直接观看www| 国产一区二区三区免费| 免费成人av资源网| 天天综合网天天综合色| 亚洲一级二级在线| 亚洲日本欧美天堂| 国产女人18水真多18精品一级做| 欧美va亚洲va在线观看蝴蝶网| 6080午夜不卡| 欧美人与禽zozo性伦| 欧美视频三区在线播放| 91黄色激情网站| 欧洲一区二区三区免费视频| 在线看日韩精品电影| 在线视频观看一区| 色婷婷精品久久二区二区蜜臂av| 波波电影院一区二区三区| 国产成人无遮挡在线视频| 国产伦精品一区二区三区免费迷 | 91小视频免费观看| 国产一区二区成人久久免费影院| 欧美色手机在线观看| 成人91在线观看| jlzzjlzz亚洲女人18| 成人综合在线网站| heyzo一本久久综合| eeuss鲁片一区二区三区在线看| 成人h动漫精品一区二区| 波多野结衣中文字幕一区二区三区 | 另类小说视频一区二区| 男女视频一区二区| 精品一区二区三区不卡| 国产剧情一区在线| 成人免费看片app下载| av影院午夜一区| 在线视频亚洲一区| 欧美男人的天堂一二区| 日韩一二在线观看| 久久99最新地址| 日本午夜一区二区| 久久99国产精品麻豆| 国产一区二区福利视频| 97se亚洲国产综合自在线| 在线国产亚洲欧美| 91精品国产综合久久精品| 欧美大片顶级少妇| 中文在线资源观看网站视频免费不卡| 亚洲色图在线视频| 亚洲综合丝袜美腿| 美国av一区二区| 成人app下载| 制服视频三区第一页精品| 亚洲成人7777| 国产麻豆精品视频| 色一情一伦一子一伦一区| 91精品国产一区二区三区香蕉| 国产午夜精品久久| 亚洲精品日韩专区silk| 免费看黄色91| 96av麻豆蜜桃一区二区| 7878成人国产在线观看| 欧美国产国产综合| 亚洲国产精品久久久久秋霞影院| 狠狠色丁香久久婷婷综| 91蝌蚪国产九色| 欧美xxxx在线观看| 国产精品久久久久久久久搜平片 | 国产福利91精品一区二区三区| 99国产麻豆精品| 欧美一级日韩免费不卡| 国产精品美女久久久久高潮| 日韩成人av影视| 福利电影一区二区三区| 这里只有精品免费| 成人欧美一区二区三区黑人麻豆| 日本丶国产丶欧美色综合| 日韩三级视频中文字幕| 亚洲天堂中文字幕| 激情深爱一区二区| 欧美午夜宅男影院| 欧美国产精品一区| 免费观看在线综合| 在线一区二区三区| 久久综合成人精品亚洲另类欧美 | 日韩欧美区一区二| 亚洲精品一二三| 国产成人亚洲综合a∨猫咪| 亚洲猫色日本管| 日韩黄色免费电影| 99精品视频一区二区三区| 精品国产伦一区二区三区免费| 亚洲综合男人的天堂| 成人做爰69片免费看网站| 日韩你懂的在线观看| 性欧美疯狂xxxxbbbb| 91亚洲永久精品| 欧美经典一区二区| 极品少妇一区二区| 在线播放国产精品二区一二区四区| 成人欧美一区二区三区1314| 岛国精品在线观看| 青椒成人免费视频| 欧美视频中文一区二区三区在线观看| 国产精品美女www爽爽爽| 国产资源精品在线观看| 日韩美女一区二区三区四区| 人禽交欧美网站| 欧美精品乱码久久久久久按摩| 亚洲国产精品人人做人人爽| 在线观看视频一区二区| 亚洲视频网在线直播| av一区二区三区四区| 亚洲欧洲av另类| 91农村精品一区二区在线| 国产精品久久久久久久久晋中| 成人性色生活片免费看爆迷你毛片| 欧美不卡一区二区三区四区| 亚洲成人在线免费| 91免费观看在线| 玉足女爽爽91| 欧美色综合天天久久综合精品| 亚洲卡通动漫在线| 一本色道久久加勒比精品 | 国产精品久久久久久久久搜平片| 成人午夜激情在线| 国产精品少妇自拍| av动漫一区二区| 樱花草国产18久久久久| 在线免费av一区| 欧美色精品天天在线观看视频| 亚洲五码中文字幕| 欧美精品久久天天躁| 人人爽香蕉精品| 久久久久免费观看| 成人美女视频在线观看18| 中文字幕一区二区三区不卡| 在线观看日韩一区| 天涯成人国产亚洲精品一区av| 精品美女在线播放| 国产91综合网| 一区二区三区在线视频观看58 | 色哟哟一区二区| 亚洲日本成人在线观看| 一本到一区二区三区| 性欧美大战久久久久久久久| 精品国产一区二区在线观看| 高清免费成人av| 亚洲精品大片www| 日韩免费在线观看| 丁香桃色午夜亚洲一区二区三区| 亚洲欧美另类久久久精品| 欧美高清视频在线高清观看mv色露露十八 | 日韩情涩欧美日韩视频| 国产.精品.日韩.另类.中文.在线.播放| 亚洲欧美激情插| 欧美va亚洲va在线观看蝴蝶网| gogogo免费视频观看亚洲一| 午夜精品一区二区三区免费视频| 精品毛片乱码1区2区3区 | 精品久久久久一区| 成av人片一区二区| 蜜臀99久久精品久久久久久软件| 欧美国产综合色视频| 日本一区二区三级电影在线观看| 91精品福利视频| 91精品啪在线观看国产60岁| 国产一区二区三区免费在线观看| 亚洲欧洲综合另类| 日韩精品一区二区三区在线观看| 成人av网址在线观看| 三级亚洲高清视频| 国产精品久久毛片a| 欧美一区二区视频在线观看2020| 9色porny自拍视频一区二区| 麻豆久久久久久久| 亚洲精品美国一| 国产欧美va欧美不卡在线| 欧美日韩亚洲综合在线|