[xcodeitalia] Habemus parser! :)

  • From: Claudio Mezzasalma <claudio.mezzasalma@xxxxxxxxx>
  • To: xcodeitalia@xxxxxxxxxxxxx
  • Date: Mon, 17 Mar 2008 17:07:58 +0100

...Anche se, a mio modo di vedere, è molto "vulnerabile". La funzione va scritta per bene, nella forma y=ax^n+bx^m+...+c, pena il blocco dello scanner e di tutta l'applicazione. Purtroppo temo che sia difficilmente milgiorabile; la mia paura è che, soprattutto se decidiamo in futuro di inserire tipi di funzioni diverse da quella lineare, dovremo affidarci a Lex (che non è molto simpatico da impostare). Comunque incollo i sorgenti qui sotto (da tenere presente che va adattata all'uso di un controller, secondo il mio modo di vedere, ma per ora va bene per fare qualche test).


Even if, from my point of view, it's really "vulnerable". The function must be well-formed, i.e. y=ax^n+bx^m+...+c, or the scanner and the entire application will lock up. Unfortunately I feel that this is poorly improvable; my fear is that, especially if we're going to introduce kinds of functions other than the linear one, we should switch to Lex (which is a real pain to set up). However, i'm going to paste the source code (from my point of view it should be adapted to allow a controller to be used, but it's ok for some quick test).

@implementation functionParser
- (IBAction)parseFunction:(id)sender; {
        NSMutableArray *factorsArray = [[NSMutableArray array] init];
        NSMutableArray *functionArray = [[NSMutableArray array] init];
        int exponent;
        float coefficient;
        NSLog (@"%@",[functionTextField stringValue]);
NSString *functionString = [NSString stringWithString: [functionTextField stringValue]]; NSScanner *functionScanner = [NSScanner scannerWithString:functionString];
        [functionScanner setScanLocation: 2];
        while ([functionScanner isAtEnd] == NO)
        {
                if ([functionScanner scanFloat: &coefficient]) {
                        if([functionScanner scanString: @"x^" intoString:NULL]) 
{
                                [functionScanner scanInt: &exponent];
                        }
                        else if ([functionScanner scanString: @"x" 
intoString:NULL]) {
                                exponent = 1;
                        }
                        else {
                                exponent = 0;
                        }
[factorsArray insertObject: [NSNumber numberWithFloat:coefficient] atIndex: 0]; [factorsArray insertObject: [NSNumber numberWithFloat:exponent] atIndex: 1];
                        [functionArray addObject: factorsArray];
                }
                
        }
        //return functionArray;
}
@end

Other related posts:

  • » [xcodeitalia] Habemus parser! :)