Пример #1
0
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;
}
Пример #2
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;	
	 
 }
Пример #3
0
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()));
}
Пример #4
0
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  );
	}
}