2012-03-16 64 views
1

目前我正在製作一個計算器,允許用戶輸入他們想要的公式。防止計算器語法錯誤崩潰? Xcode

Ex。 ((1 + 1)** 9)+2)

這工作得很好,我用兩種方法來計算這個。

第一:

answer = [[NSExpression expressionWithFormat:typeTo.text, nil] expressionValueWithObject:nil context:nil]; 
    typeTo.text = [NSString stringWithFormat:@"%@", answer]; 
    answerLabel.text = [NSString stringWithFormat:@"ANS { %@ }", answer]; 

二:

 answer = [GCMathParser evaluate:typeTo.text]; 

這兩種計算問題毫無困難。但是,如果用戶類型:

(1 + 1))[2個括號]

兩種方式崩潰。這是許多不同語法錯誤的一個例子。有沒有辦法輕鬆防止這種情況?

附加信息: 這是第二個方法捕捉到該錯誤的方式:

#ifdef __COCOA_IMPLEMENTATION__ 
[NSException raise:@"Error in expression" format:@"error = %s", errStr]; 
#endif 

謝謝:d

回答

3

我沒有使用任一這些的但基於所述附加信息,它可以拋出一個NSException。

如果是這樣的話,你可以抓住它並處理它。它看起來可能會格式化一條有用的消息,告訴你表達式有什麼問題。

@try 
{ 
    // do work 
} 
@catch(NSException* ex) 
{ 
    // handle 
} 

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html

而且,看看如果這些圖書館提供的是傳遞一個裁判NSError功能。如果是這樣,你可以使用它。

還有DDMathParser,它應該是一個現代的數學解析器,它看起來像它需要NSError。也許值得一瞧。

http://github.com/davedelong/DDMathParser

+0

您先生。是個天才。我不能夠感謝你! – 2012-03-16 00:57:13

+0

還有DDMathParser,它應該是現代的,並採取NSError。看看這裏:https://github.com/davedelong/DDMathParser – bryanmac 2012-03-16 00:59:56

+0

沒錯,這很好地解決了我的問題。我可能最終會使用它,但現在我擁有它的方式是合適的 – 2012-03-16 01:49:39