2011-11-22 21 views

回答

1

您可以使用NCalc庫將數學表達式x + 1/y 編譯爲imathas表達式。 NCalc庫創建給定數學表達式字符串的抽象語法樹(AST) 。然後,您可以創建一個訪問者,它將AST轉換爲imathas表達式。有關 訪客模式的更多信息,請參閱以下wikipedia文章。

的(不完全)下面的例子應該給你一個起點:

// Implement a visitor 
public class ImathasVisitor: LogicalExpressionVisitor 
{ 
    // Result contains the imathas expression 
    // after the visit. 
    public StringBuilder Result = new StringBuilder(); 

    public override void Visit(Function function) 
    {     
    } 

    public override void Visit(LogicalExpression expression) 
    {     
    } 

    public override void Visit(TernaryExpression expression) 
    {     
    } 

    public override void Visit(UnaryExpression expression) 
    {     
    } 

    public override void Visit(Identifier identifier) 
    { 
    Result.AppendFormat("{{{0}}}", identifier.Name); 
    }   

    public override void Visit(ValueExpression expression) 
    { 
    Result.AppendFormat("{{{0}}}", expression.Value); 
    } 

    public override void Visit(BinaryExpression expression) 
    {         
    switch(expression.Type) 
    { 
     case BinaryExpressionType.Div: 
     Result.Append("\\frac{"); 
     expression.LeftExpression.Accept(this); 
     Result.Append("}{"); 
     expression.RightExpression.Accept(this); 
     Result.Append("}"); 
     break; 
     case BinaryExpressionType.Plus: 
     expression.LeftExpression.Accept(this);    
     Result.Append(HttpUtility.UrlEncode("+")); 
     expression.RightExpression.Accept(this);     
     break; 
     case BinaryExpressionType.Minus: 
     expression.LeftExpression.Accept(this);    
     Result.Append("-"); 
     expression.RightExpression.Accept(this);     
     break; 
    }             
    }   
} 

static void Main(string[] args) 
{ 
    // Create a NCalc expression. 
    NCalc.Expression e = new NCalc.Expression("x + 1/y"); 

    // Check for syntax errors. 
    if(e.HasErrors()) 
    { 
    Console.Out.WriteLine("Syntax error."); 
    return; 
    } 

    // Transform the parsed expression into 
    // an imathas expression. 
    ImathasVisitor iv = new ImathasVisitor(); 
    e.ParsedExpression.Accept(iv); 

    Console.Out.WriteLine(iv.Result); 
} 

對於訪問者NCalc庫 配備了一個構建在SerializationVisitor比較詳細的例子,你絕對應該 看看在。

希望,這有助於。

相關問題