|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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天自制操作系统> 一书中提取出来的.
复制代码 |
|