int main(int argc, char *argv[]) { int i = 0; // 2 3 4 + 5 * - ExprToken *pExprTokens = (ExprToken *)malloc(sizeof(ExprToken) * 7); pExprTokens[0].type = operand; pExprTokens[0].value = 2; pExprTokens[1].type = operand; pExprTokens[1].value = 3; pExprTokens[2].type = operand; pExprTokens[2].value = 4; pExprTokens[3].type = plus; pExprTokens[3].value = 0; pExprTokens[4].type = operand; pExprTokens[4].value = 5; pExprTokens[5].type = times; pExprTokens[5].value = 0; pExprTokens[6].type = minus; pExprTokens[6].value = 0; printf("Expression: 2 3 4 + 5 * -\n"); calcExpr(pExprTokens, 7); free( pExprTokens ); // 2 - (3 + 4 ) * 5 pExprTokens = (ExprToken *)malloc(sizeof(ExprToken) * 9); pExprTokens[0].type = operand; pExprTokens[0].value = 2; pExprTokens[1].type = minus; pExprTokens[1].value = 0; pExprTokens[2].type = lparen; pExprTokens[2].value = 0; pExprTokens[3].type = operand; pExprTokens[3].value = 3; pExprTokens[4].type = plus; pExprTokens[4].value = 0; pExprTokens[5].type = operand; pExprTokens[5].value = 4; pExprTokens[6].type = rparen; pExprTokens[6].value = 0; pExprTokens[7].type = times; pExprTokens[7].value = 0; pExprTokens[8].type = operand; pExprTokens[8].value = 5; printf("Infix Expression: 2 - (3 + 4 ) * 5\n"); printf("Postfix Expression: \n"); convertInfixToPostfix(pExprTokens, 9); free( pExprTokens ); return 0; }
double CAdjustStock::calcExpr( const Tree &tree ) { //int num = tree.childNum(); for (int i = 0; i < tree.childNum() ; i++) { const Tree& tmp_tree = tree.child(i) ; calcExpr(tmp_tree); } double calResult=0; //当前节点类型 //cout << "tree type =" << tree->getType(tree) << endl; switch (tree.type()) { case LT_: case GT: case OR: case AND: { double a1=numbers.top(); numbers.pop(); double a2=numbers.top(); numbers.pop(); calResult = OP(tree.type(),a1,a2); break; } case DOUBLE: { numbers.push( ChToInt(tree.text().c_str(), tree.text().length()) ); break; } case VAR: { //取到语法树的变量节点 a,b string strVar( tree.text() ); map<string, double>::iterator iter; iter = m_parseMap.find(strVar); if ( iter != m_parseMap.end() ) { //查找,转换成变量对应的数值 numbers.push( iter->second ); } } default: { break; } } return calResult; }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); signalMapper = new QSignalMapper(this); connect(ui->pushButton_0, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_0, "0"); connect(ui->pushButton_1, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_1, "1"); connect(ui->pushButton_2, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_2, "2"); connect(ui->pushButton_3, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_3, "3"); connect(ui->pushButton_4, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_4, "4"); connect(ui->pushButton_5, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_5, "5"); connect(ui->pushButton_6, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_6, "6"); connect(ui->pushButton_7, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_7, "7"); connect(ui->pushButton_8, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_8, "8"); connect(ui->pushButton_9, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_9, "9"); connect(ui->pushButton_plus, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_plus, "+"); connect(ui->pushButton_minus, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_minus, "-"); connect(ui->pushButton_mult, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_mult, "*"); connect(ui->pushButton_div, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_div, "/"); connect(ui->pushButton_dot, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(ui->pushButton_dot, "."); connect(signalMapper, SIGNAL(mapped(const QString&)), this, SLOT(exprEntered(const QString&))); connect(ui->pushButton_eql, SIGNAL(clicked()), this, SLOT(calcExpr())); }
bool CAdjustStock::ParseAdjustLogic(const char* logicExp, HASH_MAP< string, double >&signalMap) { pANTLR3_INPUT_STREAM input; pExprLexer lexer; pANTLR3_COMMON_TOKEN_STREAM tstream ; pExprParser parser; pANTLR3_BASE_TREE root ; if( strlen(logicExp) == 0 ) return false ; try { input = antlr3StringStreamNew( (pANTLR3_UINT8) logicExp, ANTLR3_ENC_UTF8, strlen(logicExp), (pANTLR3_UINT8)"Expr" ); SHOULD( input, "fail to create stream from string: " << logicExp ); lexer = ExprLexerNew( input ); SHOULD( input, "fail to create lexer" ); tstream = antlr3CommonTokenStreamSourceNew( ANTLR3_SIZE_HINT, TOKENSOURCE(lexer) ); SHOULD( tstream, "fail to create token stream" ); parser = ExprParserNew( tstream ); SHOULD( parser, "fail to create parser" ); ExprParser_expr_return statments = (ExprParser_expr_return)( parser->expr(parser) ); int errs = parser->pParser->rec->state->errorCount; if( errs>0 ){ LOG_FILE(LOG_LEVEL::LOG_INFO,"[AdjustStock] The parser returned %d errors, tree walking aborted.\n", errs); return false ; } root = statments.tree; SHOULD( root, "fail to get tree" ); pANTLR3_TOKEN_STREAM stream = tstream->tstream; m_adjustTree.tree_ = root; m_adjustTree.stream_ = stream; //根据语法树的节点得到叶子节点类型为VAR的变量,返给调仓查询 //修改叶子节点是变量的值,key用Value替换 getVARList( m_adjustTree, m_varVec ); HASH_MAP< string, double >::iterator mit; //test: srcSingleMap[000407_alpha_7_indus_sort, 1.23] for ( size_t i =0; i<m_varVec.size(); i++ ) { mit = signalMap.find(m_varVec[i]); if ( mit != signalMap.end() ) { m_parseMap[m_varVec[i]] = mit->second; } else { ISM_LOG_ERR("[AdjustStock]","the signal value not founded in singal map!"); return false; } } //calculate the result from the replaced tree int result = calcExpr(m_adjustTree); if( parser ) { parser->free( parser );} if( tstream ) { tstream->free( tstream );} if( lexer ) { lexer->free( lexer );} if( input ) { input->close( input );} return result==1 ; } catch( Exp& e ) { RETHROW( e, "fail to parse. line: " << logicExp ); } }