Archived
1
This repository has been archived on 2022-08-08. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
mathpad/MathPad/MPMath.ym
2014-09-06 01:54:15 +02:00

126 lines
3.1 KiB
Plaintext

%{
#import "MPMath.h"
#define AT @
MPParsedElement *parseResult;
int yylex();
int yyparse();
FILE *yyin;
void yyerror(const char *s);
%}
%error-verbose
%initial-action
{
parseResult = [[MPParsedElement alloc] init];
};
%union {
double number;
}
/* Terminals */
%token PLUS
%left MINUS
%token DOT
%token <number> NUMBER
/* Nonterminals */
%type <number> summands
%type <number> factor
%type <number> product
%%
element:
factor { parseResult.isFactor = YES;
parseResult.factor = $1;
}
| operator
| prefix summands suffix
;
factor:
DOT product DOT { $$ = $2;
}
| DOT product { $$ = $2;
}
| product DOT { $$ = $1;
}
| product { $$ = $1;
}
;
product:
product DOT product { $$ = $1 * $3;
}
| product product { $$ = $1 * $2;
}
| NUMBER { $$ = $1;
}
;
operator:
PLUS { parseResult.suffixMultiplicator = 1;
parseResult.hasSuffixMultiplicator = YES;
}
| MINUS { parseResult.suffixMultiplicator = -1;
parseResult.hasSuffixMultiplicator = YES;
NSLog(AT"Op");
}
| DOT { parseResult.isFactor = YES;
parseResult.factor = 1;
}
| { parseResult.isFactor = YES;
parseResult.factor = 1;
}
;
prefix:
DOT product { parseResult.prefixMultiplicator = $2;
parseResult.hasPrefixMultiplicator = YES;
parseResult.prefixOperatorExplicit = YES;
}
| product { parseResult.prefixMultiplicator = $1;
parseResult.hasPrefixMultiplicator = YES;
parseResult.prefixOperatorExplicit = YES;
}
| { parseResult.hasPrefixMultiplicator = NO;
}
;
summands:
summands summand
| summand
;
summand:
PLUS product { [parseResult.summands addObject:AT($2)];
}
| MINUS product { [parseResult.summands addObject:AT(-$2)];
}
;
suffix:
PLUS { parseResult.suffixMultiplicator = 1;
parseResult.hasSuffixMultiplicator = YES;
}
| MINUS { parseResult.suffixMultiplicator = -1;
parseResult.hasSuffixMultiplicator = YES;
}
| DOT { parseResult.suffixMultiplicator = 0;
parseResult.hasSuffixMultiplicator = YES;
}
| { parseResult.hasSuffixMultiplicator = NO;
}
;
%%
void yyerror(const char *s) {
NSLog(@"EEK, parse error! Message: %s", s);
// might as well halt now:
exit(-1);
}