马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 错过会难过 于 2015-10-31 10:13 编辑 #include <iostream>
using namespace std;
#define INVALID -0x7fffffff
char *skipspace( char *p );
int getnum( char **pp , int priority );
int _tmain(int argc, _TCHAR* argv[])
{
int i;
char s[30] ="(1+2)*2+1", *p;
p = s;
i = getnum( &p , 9 );
if( i == INVALID ) {
printf( "cuowu\n" );
}
else {
printf("= %d = 0x%x\n" , i , i );
}
return 0;
}
char *skipspace( char *p )
{
for( ; *p == ' '; p++ ) {} /* スペースを読み飛ばす */
return p;
}
int getnum( char **pp , int priority )
{
char *p = *pp;
int i = INVALID , j;
p = skipspace( p );
/* 単項演算子 */
if( *p == '+' ) {
p = skipspace( p + 1 );
i = getnum( &p , 0 );
}
else if( *p == '-' ) {
p = skipspace( p + 1 );
i = getnum( &p , 0 );
if( i != INVALID ) {
i = -i;
}
}
else if( *p == '~' ) {
p = skipspace( p + 1 );
i = getnum( &p , 0 );
if( i != INVALID ) {
i = ~i;
}
}
else if( *p == '(' ) { /* かっこ */
p = skipspace( p + 1 );
i = getnum( &p , 9 );
if( *p == ')' ) {
p = skipspace( p + 1 );
}
else {
i = INVALID;
}
}
else if( '0' <= *p && *p <= '9' ) { /* 数値 */
i = strtol( p , &p , 0 );
}
else { /* エラー */
i = INVALID;
}
[hide]/* 二項演算子 */
for( ;; ) {
if( i == INVALID ) {
break;
}
p = skipspace( p );
if( *p == '+' && priority > 2 ) {
p = skipspace( p + 1 );
j = getnum( &p , 2 );
if( j != INVALID ) {
i += j;
}
else {
i = INVALID;
}
}
else if( *p == '-' && priority > 2 ) {
p = skipspace( p + 1 );
j = getnum( &p , 2 );
if( j != INVALID ) {
i -= j;
}
else {
i = INVALID;
}
}
else if( *p == '*' && priority > 1 ) {
p = skipspace( p + 1 );
j = getnum( &p , 1 );
if( j != INVALID ) {
i *= j;
}
else {
i = INVALID;
}
}
else if( *p == '/' && priority > 1 ) {
p = skipspace( p + 1 );
j = getnum( &p , 1 );
if( j != INVALID && j != 0 ) {
i /= j;
}
else {
i = INVALID;
}
}
else if( *p == '%' && priority > 1 ) {
p = skipspace( p + 1 );
j = getnum( &p , 1 );
if( j != INVALID && j != 0 ) {
i %= j;
}
else {
i = INVALID;
}
}
else if( *p == '<' && p[1] == '<' && priority > 3 ) {
p = skipspace( p + 2 );
j = getnum( &p , 3 );
if( j != INVALID && j != 0 ) {
i <<= j;
}
else {
i = INVALID;
}
}
else if( *p == '>' && p[1] == '>' && priority > 3 ) {
p = skipspace( p + 2 );
j = getnum( &p , 3 );
if( j != INVALID && j != 0 ) {
i >>= j;
}
else {
i = INVALID;
}
}
else if( *p == '&' && priority > 4 ) {
p = skipspace( p + 1 );
j = getnum( &p , 4 );
if( j != INVALID ) {
i &= j;
}
else {
i = INVALID;
}
}
else if( *p == '^' && priority > 5 ) {
p = skipspace( p + 1 );
j = getnum( &p , 5 );
if( j != INVALID ) {
i ^= j;
}
else {
i = INVALID;
}
}
else if( *p == '|' && priority > 6 ) {
p = skipspace( p + 1 );
j = getnum( &p , 6 );
if( j != INVALID ) {
i |= j;
}
else {
i = INVALID;
}
}
else {
break;
}
}
p = skipspace( p );
*pp = p;
return i;
}[/hide]
此代码是 <30天自制操作系统> 一书中提取出来的.
|