int caparse(char *string, int values[]) { #define sp string[pos] int negate = 0; int state = 0; int oper = OP_OR; int pos = 0; for (;((sp) && (sp != ')'));pos++) { if (isalpha((int)sp)) { state = doper(state, oper, negate ? !values[sp-'a'] : values[sp-'a']); negate = 0; } else switch (sp) { case '|' : oper = OP_OR; break; case '&' : oper = OP_AND; break; case '^' : oper = OP_XOR; break; case '!' : negate = 1; break; case '(' : pos++; state = doper(state, oper, negate ? !caparse(&sp, values) : caparse(&sp, values)); { int bra = 1; while (bra) { if (sp=='(') bra++; if (sp==')') bra--; printf("%d\n", bra); if (bra) pos++; } } break; default : break; } } return state; }
void DaoInitLexTable() { int i, j = DAO_NOKEY1+1; if( daoLexTable[0][0] <= TOK_ERROR ) return; memset( daoLexTable, TOK_RESTART, 128 * TOK_ERROR * sizeof(char) ); memset( daoSpaceType, DTOK_NONE, 128 * sizeof(char) ); memset( daoLexTable[TOK_NUMBER_SCI_E], TOK_ERROR, 128 * sizeof(char) ); memset( daoLexTable[TOK_NUMBER_SCI_ES], TOK_ERROR, 128 * sizeof(char) ); daoSpaceType[ (unsigned) ' ' ] = DTOK_BLANK; daoSpaceType[ (unsigned) '\t' ] = DTOK_TAB; daoSpaceType[ (unsigned) '\n' ] = DTOK_NEWLN; daoSpaceType[ (unsigned) '\r' ] = DTOK_NEWLN; for(j=0; j<128; j++){ daoLexTable[ TOK_LSB ][j] = TOK_RESTART; daoLexTable[ TOK_OP_RGXM ][ j ] = TOK_RESTART; daoLexTable[ TOK_OP_RGXU ][ j ] = TOK_RESTART; daoLexTable[ TOK_OP_RGXA ][ j ] = TOK_RESTART; daoLexTable[ TOK_OP_ESC ][j] = TOK_END; daoLexTable[ TOK_OP_SHARP ][j] = TOK_COMT_LINE; daoLexTable[ TOK_COMT_LINE ][j] = TOK_COMT_LINE; daoLexTable[ TOK_STRING_MBS ][ j ] = TOK_STRING_MBS; daoLexTable[ TOK_STRING_WCS ][ j ] = TOK_STRING_WCS; daoLexTable[ TOK_VERBATIM ][ j ] = TOK_ERROR; if( isdigit( j ) ){ daoLexTable[ TOK_START ][ j ] = TOK_DIGITS_DEC; daoLexTable[ TOK_DIGITS_DEC ][ j ] = TOK_DIGITS_DEC; daoLexTable[ TOK_OP_DOT ][ j ] = TOK_DOT_DIGITS; daoLexTable[ TOK_DIGITS_0 ][ j ] = TOK_DIGITS_DEC; daoLexTable[ TOK_DIGITS_0X ][ j ] = TOK_NUMBER_HEX; daoLexTable[ TOK_DOT_DIGITS ][ j ] = TOK_DOT_DIGITS; daoLexTable[ TOK_DIGITS_DOT ][ j ] = TOK_NUMBER_DEC; daoLexTable[ TOK_NUMBER_DEC ][ j ] = TOK_NUMBER_DEC; daoLexTable[ TOK_NUMBER_HEX ][ j ] = TOK_NUMBER_HEX; daoLexTable[ TOK_NUMBER_SCI_E ][ j ] = TOK_NUMBER_SCI; daoLexTable[ TOK_NUMBER_SCI_ES ][ j ] = TOK_NUMBER_SCI; daoLexTable[ TOK_NUMBER_SCI ][ j ] = TOK_NUMBER_SCI; daoLexTable[ TOK_IDENTIFIER ][ j ] = TOK_IDENTIFIER; daoLexTable[ TOK_ID_INITYPE ][ j ] = TOK_ID_INITYPE; daoLexTable[ TOK_ID_SYMBOL ][ j ] = TOK_ID_SYMBOL; daoLexTable[ TOK_OP_AT ][ j ] = TOK_ID_INITYPE; /* @3 */ daoLexTable[ TOK_VERBATIM ][j] = TOK_VERBATIM; }else if( isalpha( j ) || j == '_' ){ daoLexTable[ TOK_START ][ j ] = TOK_IDENTIFIER; daoLexTable[ TOK_IDENTIFIER ][ j ] = TOK_IDENTIFIER; daoLexTable[ TOK_ID_INITYPE ][ j ] = TOK_ID_INITYPE; daoLexTable[ TOK_ID_SYMBOL ][ j ] = TOK_ID_SYMBOL; daoLexTable[ TOK_OP_AT ][ j ] = TOK_ID_INITYPE; /* @T */ daoLexTable[ TOK_OP_IMG ][ j ] = TOK_ID_SYMBOL; /* $S */ daoLexTable[ TOK_VERBATIM ][j] = TOK_VERBATIM; daoLexTable[ TOK_DIGITS_DEC ][ j ] = TOK_ERROR; daoLexTable[ TOK_DIGITS_0 ][ j ] = TOK_ERROR; daoLexTable[ TOK_DOT_DIGITS ][ j ] = TOK_ERROR; daoLexTable[ TOK_DIGITS_DOT ][ j ] = TOK_ERROR; daoLexTable[ TOK_NUMBER_DEC ][ j ] = TOK_ERROR; daoLexTable[ TOK_NUMBER_SCI_E ][ j ] = TOK_ERROR; daoLexTable[ TOK_NUMBER_SCI_ES ][ j ] = TOK_ERROR; daoLexTable[ TOK_NUMBER_SCI ][ j ] = TOK_ERROR; if( isxdigit( j ) ){ daoLexTable[ TOK_DIGITS_0X ][ j ] = TOK_NUMBER_HEX; daoLexTable[ TOK_NUMBER_HEX ][ j ] = TOK_NUMBER_HEX; }else{ daoLexTable[ TOK_DIGITS_0X ][ j ] = TOK_ERROR; daoLexTable[ TOK_NUMBER_HEX ][ j ] = TOK_ERROR; } }else{ daoLexTable[ TOK_DIGITS_0X ][ j ] = TOK_ERROR; } } daoLexTable[ TOK_START ][ (unsigned) '(' ] = TOK_END_LB; daoLexTable[ TOK_START ][ (unsigned) ')' ] = TOK_END_RB; daoLexTable[ TOK_START ][ (unsigned) '{' ] = TOK_END_LCB; daoLexTable[ TOK_START ][ (unsigned) '}' ] = TOK_END_RCB; daoLexTable[ TOK_START ][ (unsigned) '[' ] = TOK_END_LSB; daoLexTable[ TOK_START ][ (unsigned) ']' ] = TOK_END_RSB; daoLexTable[ TOK_START ][ (unsigned) ',' ] = TOK_END_COMMA; daoLexTable[ TOK_START ][ (unsigned) ';' ] = TOK_END_SEMCO; daoLexTable[ TOK_OP_SHARP ][ (unsigned) '\n' ] = TOK_END_CMT; daoLexTable[ TOK_OP_SHARP ][ (unsigned) '\r' ] = TOK_END_CMT; daoLexTable[ TOK_COMT_LINE ][ (unsigned) '\n' ] = TOK_END_CMT; daoLexTable[ TOK_COMT_LINE ][ (unsigned) '\r' ] = TOK_END_CMT; daoLexTable[ TOK_START ][ (unsigned) '\'' ] = TOK_STRING_MBS; daoLexTable[ TOK_STRING_MBS ][ (unsigned) '\'' ] = TOK_END_MBS; daoLexTable[ TOK_START ][ (unsigned) '\"' ] = TOK_STRING_WCS; daoLexTable[ TOK_STRING_WCS ][ (unsigned) '\"' ] = TOK_END_WCS; daoLexTable[ TOK_START ][ (unsigned) '.' ] = TOK_OP_DOT; daoLexTable[ TOK_OP_DOT ][ (unsigned) '.' ] = TOK_OP_DOT2; daoLexTable[ TOK_OP_DOT2 ][ (unsigned) '.' ] = TOK_END_DOTS; /* ... */ daoLexTable[ TOK_DIGITS_0 ][ (unsigned) '.' ] = TOK_DIGITS_DOT; daoLexTable[ TOK_DIGITS_DEC ][ (unsigned) '.' ] = TOK_DIGITS_DOT; daoLexTable[ TOK_DIGITS_0 ][ (unsigned) 'L' ] = TOK_DIGITS_DEC; daoLexTable[ TOK_DIGITS_DEC ][ (unsigned) 'L' ] = TOK_DIGITS_DEC; daoLexTable[ TOK_NUMBER_HEX ][ (unsigned) 'L' ] = TOK_NUMBER_HEX; daoLexTable[ TOK_DIGITS_0 ][ (unsigned) 'D' ] = TOK_DOUBLE_DEC; daoLexTable[ TOK_DIGITS_DEC ][ (unsigned) 'D' ] = TOK_DOUBLE_DEC; daoLexTable[ TOK_DOT_DIGITS ][ (unsigned) 'D' ] = TOK_DOUBLE_DEC; daoLexTable[ TOK_DIGITS_DOT ][ (unsigned) 'D' ] = TOK_DOUBLE_DEC; daoLexTable[ TOK_NUMBER_DEC ][ (unsigned) 'D' ] = TOK_DOUBLE_DEC; daoLexTable[ TOK_DIGITS_0 ][ (unsigned) '$' ] = TOK_NUMBER_IMG; daoLexTable[ TOK_DIGITS_DEC ][ (unsigned) '$' ] = TOK_NUMBER_IMG; daoLexTable[ TOK_NUMBER_DEC ][ (unsigned) '$' ] = TOK_NUMBER_IMG; daoLexTable[ TOK_NUMBER_SCI ][ (unsigned) '$' ] = TOK_NUMBER_IMG; daoLexTable[ TOK_IDENTIFIER ][ (unsigned) '.' ] = TOK_RESTART; daoLexTable[ TOK_ID_INITYPE ][ (unsigned) '.' ] = TOK_RESTART; daoLexTable[ TOK_ID_SYMBOL ][ (unsigned) '.' ] = TOK_RESTART; daoLexTable[ TOK_OP_SHARP ][ (unsigned) '{' ] = TOK_COMT_OPEN; daoLexTable[ TOK_OP_SHARP ][ (unsigned) '}' ] = TOK_COMT_CLOSE; daoLexTable[ TOK_START ][ (unsigned) '\\' ] = TOK_OP_ESC; daoLexTable[ TOK_START ][ (unsigned) '@' ] = TOK_OP_AT; daoLexTable[ TOK_OP_AT ][ (unsigned) '@' ] = TOK_OP_AT2; daoLexTable[ TOK_OP_AT ][ (unsigned) '[' ] = TOK_VERBATIM; daoLexTable[ TOK_OP_AT2 ][ (unsigned) '[' ] = TOK_VERBATIM; daoLexTable[ TOK_VERBATIM ][ (unsigned) ' ' ] = TOK_VERBATIM; daoLexTable[ TOK_VERBATIM ][ (unsigned) '.' ] = TOK_VERBATIM; daoLexTable[ TOK_VERBATIM ][ (unsigned) ':' ] = TOK_VERBATIM; daoLexTable[ TOK_VERBATIM ][ (unsigned) '-' ] = TOK_VERBATIM; daoLexTable[ TOK_VERBATIM ][ (unsigned) '=' ] = TOK_VERBATIM; daoLexTable[ TOK_VERBATIM ][ (unsigned) '(' ] = TOK_VERBATIM; daoLexTable[ TOK_VERBATIM ][ (unsigned) ')' ] = TOK_VERBATIM; daoLexTable[ TOK_VERBATIM ][ (unsigned) '+' ] = TOK_VERBATIM; daoLexTable[ TOK_START ][ (unsigned) '~' ] = TOK_OP_TILDE; daoLexTable[ TOK_OP_EQ ][ (unsigned) '~' ] = TOK_OP_RGXM; /* =~ */ daoLexTable[ TOK_OP_NOT ][ (unsigned) '~' ] = TOK_OP_RGXU; /* !~ */ daoLexTable[ TOK_OP_TILDE ][ (unsigned) '~' ] = TOK_OP_RGXA; /* ~~ */ daoLexTable[ TOK_START ][ (unsigned) '=' ] = TOK_OP_EQ; /* := += -= /= *= %= &= |= ^= != == <= >= */ for(i=TOK_OP_COLON; i<TOK_OP_GT; i++) daoLexTable[i][ (unsigned) '=' ] = i + (TOK_EQ_COLON - TOK_OP_COLON); daoLexTable[ TOK_START ][ (unsigned) '>' ] = TOK_OP_GT; daoLexTable[ TOK_OP_QUEST ][ (unsigned) '=' ] = TOK_END_TEQ; /* ?= */ daoLexTable[ TOK_OP_QUEST ][ (unsigned) '<' ] = TOK_END_TISA; /* ?< */ daoLexTable[ TOK_OP_TILDE ][ (unsigned) '>' ] = TOK_END_APPXTO; /* ~> */ daoLexTable[ TOK_OP_SUB ][ (unsigned) '>' ] = TOK_END_ARROW; /* -> */ daoLexTable[ TOK_OP_EQ ][ (unsigned) '>' ] = TOK_END_FIELD; /* => */ daoLexTable[ TOK_START ][ (unsigned) '<' ] = TOK_OP_LT; /* example use of generic types: */ /* routine<=>int>; list<list<int>>; abc : list<int>={} */ /* to handle them properly, the lexer should not compose tokens: <=, >>, >= */ /* to be consistent, the lexer will not compose any tokens start with < or > */ /* daoLexTable[ TOK_OP_GT ][ '>' ] = TOK_END_RSHIFT; */ /* >> */ /* daoLexTable[ TOK_OP_LT ][ '<' ] = TOK_END_LSHIFT; */ /* << */ daoLexTable[ TOK_START ][ (unsigned) '+' ] = TOK_OP_ADD; daoLexTable[ TOK_OP_ADD ][ (unsigned) '+' ] = TOK_END_INCR; /* ++ */ daoLexTable[ TOK_START ][ (unsigned) '-' ] = TOK_OP_SUB; daoLexTable[ TOK_OP_SUB ][ (unsigned) '-' ] = TOK_END_DECR; /* -- */ daoLexTable[ TOK_START ][ (unsigned) '*' ] = TOK_OP_MUL; daoLexTable[ TOK_OP_MUL ][ (unsigned) '*' ] = TOK_END_POW; /* ** */ daoLexTable[ TOK_START ][ (unsigned) '/' ] = TOK_OP_DIV; daoLexTable[ TOK_START ][ (unsigned) '&' ] = TOK_OP_AND; daoLexTable[ TOK_OP_AND ][ (unsigned) '&' ] = TOK_END_AND; /* && */ daoLexTable[ TOK_START ][ (unsigned) '|' ] = TOK_OP_OR; daoLexTable[ TOK_OP_OR ][ (unsigned) '|' ] = TOK_END_OR; /* || */ daoLexTable[ TOK_START ][ (unsigned) ':' ] = TOK_OP_COLON; daoLexTable[ TOK_OP_COLON ][ (unsigned) ':' ] = TOK_END_COLON2; /* :: */ daoLexTable[ TOK_START ][ (unsigned) '%' ] = TOK_OP_MOD; daoLexTable[ TOK_START ][ (unsigned) '!' ] = TOK_OP_NOT; daoLexTable[ TOK_START ][ (unsigned) '^' ] = TOK_OP_XOR; daoLexTable[ TOK_START ][ (unsigned) '?' ] = TOK_OP_QUEST; daoLexTable[ TOK_START ][ (unsigned) '$' ] = TOK_OP_IMG; daoLexTable[ TOK_START ][ (unsigned) '#' ] = TOK_OP_SHARP; daoLexTable[ TOK_START ][ (unsigned) '0' ] = TOK_DIGITS_0; daoLexTable[ TOK_DIGITS_0 ][ (unsigned) 'x' ] = TOK_DIGITS_0X; daoLexTable[ TOK_DIGITS_0 ][ (unsigned) 'X' ] = TOK_DIGITS_0X; daoLexTable[ TOK_DIGITS_0 ][ (unsigned) 'e' ] = TOK_NUMBER_SCI_E; daoLexTable[ TOK_DIGITS_0 ][ (unsigned) 'E' ] = TOK_NUMBER_SCI_E; daoLexTable[ TOK_DIGITS_DEC ][ (unsigned) 'e' ] = TOK_NUMBER_SCI_E; daoLexTable[ TOK_DIGITS_DEC ][ (unsigned) 'E' ] = TOK_NUMBER_SCI_E; daoLexTable[ TOK_DIGITS_DOT ][ (unsigned) 'e' ] = TOK_NUMBER_SCI_E; daoLexTable[ TOK_DIGITS_DOT ][ (unsigned) 'E' ] = TOK_NUMBER_SCI_E; daoLexTable[ TOK_NUMBER_DEC ][ (unsigned) 'e' ] = TOK_NUMBER_SCI_E; daoLexTable[ TOK_NUMBER_DEC ][ (unsigned) 'E' ] = TOK_NUMBER_SCI_E; daoLexTable[ TOK_NUMBER_SCI_E ][ (unsigned) '+' ] = TOK_NUMBER_SCI_ES; daoLexTable[ TOK_NUMBER_SCI_E ][ (unsigned) '-' ] = TOK_NUMBER_SCI_ES; daoLexTable[ TOK_OP_ESC ][ (unsigned) '(' ] = TOK_ESC_LB; daoLexTable[ TOK_OP_ESC ][ (unsigned) ')' ] = TOK_ESC_RB; daoLexTable[ TOK_OP_ESC ][ (unsigned) '{' ] = TOK_ESC_LCB; daoLexTable[ TOK_OP_ESC ][ (unsigned) '}' ] = TOK_ESC_RCB; daoLexTable[ TOK_OP_ESC ][ (unsigned) '[' ] = TOK_ESC_LSB; daoLexTable[ TOK_OP_ESC ][ (unsigned) ']' ] = TOK_ESC_RSB; daoLexTable[ TOK_OP_ESC ][ (unsigned) '|' ] = TOK_ESC_PIPE; daoLexTable[ TOK_OP_ESC ][ (unsigned) '!' ] = TOK_ESC_EXCLA; daoLexTable[ TOK_OP_ESC ][ (unsigned) '?' ] = TOK_ESC_QUES; daoLexTable[ TOK_OP_ESC ][ (unsigned) '*' ] = TOK_ESC_STAR; daoLexTable[ TOK_OP_ESC ][ (unsigned) '+' ] = TOK_ESC_PLUS; daoLexTable[ TOK_OP_ESC ][ (unsigned) '\'' ] = TOK_ESC_SQUO; daoLexTable[ TOK_OP_ESC ][ (unsigned) '\"' ] = TOK_ESC_DQUO; memset( daoArithOper, 0, DAO_NOKEY2*sizeof(DOper) ); daoArithOper[ DTOK_INCR ] = doper( DAO_OPER_INCR, 1, 0, 0 ); daoArithOper[ DTOK_DECR ] = doper( DAO_OPER_DECR, 1, 0, 0 ); daoArithOper[ DTOK_ADD ] = doper( DAO_OPER_ADD, 1, 0, 6 ); daoArithOper[ DTOK_SUB ] = doper( DAO_OPER_SUB, 1, 0, 5 ); daoArithOper[ DTOK_NOT ] = doper( DAO_OPER_NOT, 1, 0, 0 ); daoArithOper[ DKEY_NOT ] = doper( DAO_OPER_NOT, 1, 0, 0 ); daoArithOper[ DTOK_TILDE ] = doper( DAO_OPER_TILDE, 1, 0, 10 ); daoArithOper[ DTOK_AMAND ] = doper( DAO_OPER_BIT_AND, 0, 0, 1 ); daoArithOper[ DTOK_ASSN ] = doper( DAO_OPER_ASSN, 0, 0, 12 ); daoArithOper[ DTOK_CASSN ] = doper( DAO_OPER_ASSN, 0, 0, 12 ); daoArithOper[ DTOK_ADDASN ] = doper( DAO_OPER_ASSN_ADD, 0, 0, 11 ); daoArithOper[ DTOK_SUBASN ] = doper( DAO_OPER_ASSN_SUB, 0, 0, 11 ); daoArithOper[ DTOK_MULASN ] = doper( DAO_OPER_ASSN_MUL, 0, 0, 11 ); daoArithOper[ DTOK_DIVASN ] = doper( DAO_OPER_ASSN_DIV, 0, 0, 11 ); daoArithOper[ DTOK_MODASN ] = doper( DAO_OPER_ASSN_MOD, 0, 0, 11 ); daoArithOper[ DTOK_ANDASN ] = doper( DAO_OPER_ASSN_AND, 0, 0, 11 ); daoArithOper[ DTOK_ORASN ] = doper( DAO_OPER_ASSN_OR, 0, 0, 11 ); daoArithOper[ DTOK_XORASN ] = doper( DAO_OPER_ASSN_XOR, 0, 0, 11 ); daoArithOper[ DTOK_QUERY ] = doper( DAO_OPER_IF, 0, 0, 9 ); daoArithOper[ DTOK_COLON ] = doper( DAO_OPER_COLON, 0, 0, 10 ); daoArithOper[ DTOK_LSHIFT ] = doper( DAO_OPER_LLT, 0, 0, 1 ); daoArithOper[ DTOK_RSHIFT ] = doper( DAO_OPER_GGT, 0, 0, 1 ); daoArithOper[ DTOK_PIPE ] = doper( DAO_OPER_BIT_OR, 0, 0, 1 ); daoArithOper[ DTOK_XOR ] = doper( DAO_OPER_BIT_XOR, 0, 0, 1 ); daoArithOper[ DTOK_AND ] = doper( DAO_OPER_AND, 0, 0, 8 ); daoArithOper[ DKEY_AND ] = doper( DAO_OPER_AND, 0, 0, 8 ); daoArithOper[ DTOK_OR ] = doper( DAO_OPER_OR, 0, 0, 8 ); daoArithOper[ DKEY_OR ] = doper( DAO_OPER_OR, 0, 0, 8 ); daoArithOper[ DKEY_IN ] = doper( DAO_OPER_IN, 0, 0, 7 ); daoArithOper[ DTOK_NOTIN ] = doper( DAO_OPER_NOTIN, 0, 0, 7 ); daoArithOper[ DTOK_LT ] = doper( DAO_OPER_LT, 0, 0, 7 ); daoArithOper[ DTOK_GT ] = doper( DAO_OPER_GT, 0, 0, 7 ); daoArithOper[ DTOK_EQ ] = doper( DAO_OPER_EQ, 0, 0, 7 ); daoArithOper[ DTOK_NE ] = doper( DAO_OPER_NE, 0, 0, 7 ); daoArithOper[ DTOK_LE ] = doper( DAO_OPER_LE, 0, 0, 7 ); daoArithOper[ DTOK_GE ] = doper( DAO_OPER_GE, 0, 0, 7 ); daoArithOper[ DTOK_TEQ ] = doper( DAO_OPER_TEQ, 0, 0, 7 ); daoArithOper[ DTOK_TISA ] = doper( DAO_OPER_TISA, 0, 0, 7 ); daoArithOper[ DTOK_MUL ] = doper( DAO_OPER_MUL, 0, 0, 3 ); daoArithOper[ DTOK_DIV ] = doper( DAO_OPER_DIV, 0, 0, 3 ); daoArithOper[ DTOK_MOD ] = doper( DAO_OPER_MOD, 1, 0, 3 ); daoArithOper[ DTOK_POW ] = doper( DAO_OPER_POW, 0, 0, 2 ); }