Хорошо, спасибо за помощь, это последний код Objective-C, который я написал для анализа логического выражения в дереве:
принимает выражение, такое как
A AND B OR C AND NOT(B)
в форме:
A.B + C./b
Работает с разбором скобок с приоритетом:
-(TreeNode *)ParseStringIntoTree:(NSString *)InputString{ //input string to parse
//returns root-node of tree
TreeNode *first=[[TreeNode alloc] init];
TreeNode *current=first;
NSString *workingString = [NSString stringWithString:InputString];
if (([workingString characterAtIndex:0]=='(') && ([workingString characterAtIndex:workingString.length-1]==')')) {
NSRange boop={1,workingString.length-2};
workingString=[workingString substringWithRange:boop];
}
int brackCount=0;
bool plussesLeft=FALSE;
for (int pos=0; pos<workingString.length; pos++) {
char currentC=[workingString characterAtIndex:pos];
//1
if (currentC=='(') {
brackCount++;
}
//2
if (currentC==')') {
brackCount--;
}
if (currentC=='+' && brackCount==0){
plussesLeft=TRUE;
}
}
//############ PARSE plus signs with BRACKETS
brackCount=0;
int prevPlusPos=-1;
if (plussesLeft) {
for (int pos=0; pos<workingString.length; pos++) {
char currentC=[workingString characterAtIndex:pos];
//1
if (currentC=='(') {
brackCount++;
}
//2
if (currentC==')') {
brackCount--;
}
//3
if (currentC=='+'&&brackCount==0) {
NSRange boop={prevPlusPos+1, pos-prevPlusPos-1};
NSString *toParse=[workingString substringWithRange:boop];
TreeNode *child;
if(toParse.length>1){child=[self ParseStringIntoTree:toParse];}
else{child=[TreeNode newTreeNodeWithValue:toParse];}
[current addChild:child];
[current setValue:@"+"];
prevPlusPos=pos;
}
//4
if (pos==workingString.length-1 &&brackCount==0 && prevPlusPos!=-1) {
NSRange boop={prevPlusPos+1, pos-prevPlusPos};
NSString *toParse=[workingString substringWithRange:boop];
TreeNode *child;
if(toParse.length>1){child=[self ParseStringIntoTree:toParse];}
else{child=[TreeNode newTreeNodeWithValue:toParse];};
[current addChild:child];
[current setValue:@"+"];
}
}
}
//############ finish PARSE plus signs with BRACKETS
BOOL dotsLeft=FALSE;
for (int pos=0; pos<workingString.length; pos++) {
char currentC=[workingString characterAtIndex:pos];
//1
if (currentC=='(') {
brackCount++;
}
//2
if (currentC==')') {
brackCount--;
}
if (currentC=='.' && brackCount==0){
dotsLeft=TRUE;
}
}
int prevDotPos=-1;
if (!plussesLeft && dotsLeft) {
for (int pos=0; pos<workingString.length; pos++) {
char currentC=[workingString characterAtIndex:pos];
//1
if (currentC=='(') {
brackCount++;
}
//2
if (currentC==')') {
brackCount--;
}
//3
if (currentC=='.' && brackCount==0 && prevPlusPos==-1) {
NSRange boop={prevDotPos+1, pos-prevDotPos-1};
NSString *toParse=[workingString substringWithRange:boop];
TreeNode *child;
if(toParse.length>1){child=[self ParseStringIntoTree:toParse];}
else{child=[TreeNode newTreeNodeWithValue:toParse];}
[current addChild:child];
[current setValue:@"."];
prevDotPos=pos;
}
//4
if (pos==workingString.length-1 &&brackCount==0 && prevDotPos!=-1) {
NSRange boop={prevDotPos+1, pos-prevDotPos};
NSString *toParse=[workingString substringWithRange:boop];
TreeNode *child;
if(toParse.length>1){child=[self ParseStringIntoTree:toParse];}
else{child=[TreeNode newTreeNodeWithValue:toParse];};
[current addChild:child];
[current setValue:@"."];
}
}
//left with current being the
}
if (!plussesLeft && !dotsLeft) {
if ([workingString characterAtIndex:0]=='/') {
TreeNode *child=[self ParseStringIntoTree:[workingString substringFromIndex:1]];
[current addChild:child];
[current setValue:@"/"];
}
if (workingString.length==1) {
[current setValue:workingString];
}
}
return first;
}
Где объект treeNode имеет свойства и методы:
@interface TreeNode : NSObject{
NSMutableArray *children;
TreeNode *parent;
NSString *value;
}
+(TreeNode *)newTreeNodeWithValue:(NSString *)Value;
-(void)addChild:(TreeNode *)child;
Методы делают то, что подразумевается там именами.
Надеюсь, что в будущем это может помочь любому другому, ищущему парсер либо специально для булевой алгебры, либо, возможно, в качестве основы для другого парсера.