【发布时间】:2012-04-06 15:24:37
【问题描述】:
我应该如何在 parsekit 中使用回调函数?假设我有以下规则:
expr_s = expr_p '+' expr_s | expr_p ;
我应该从生成的 PKAssembly 中弹出 3 个符号并添加第一个和最后一个数字,然后将答案推回堆栈吗?
对于上述规则,我怎么知道是第一条规则还是第二条规则导致了匹配?
我不明白 ParseKit 调用回调函数的顺序。我真的需要一些帮助。
感谢 Todd 的回复,谨记您的指示 我为一个包含加法和乘法的简单数学表达式编写了以下语法和回调函数:
- (IBAction)press_equals:(id)sender {
NSString *g = @"@start = expr_s; expr_s = expr_p ('+'! expr_p)+ ; expr_p = Number ('*'! Number)+ ;";
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
NSString *s = @"3*4+4*8";
[p parse:s];
PKAssembly *res = [p parse:s];
NSLog(@"res %@", res);
}
- (void)parser:(PKParser *)p didMatchExpr_s:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
NSArray *toks = [a objectsAbove:nil];
double total = 0.0;
for (PKToken *tok in toks) {
total += tok.floatValue;
}
a.target = [NSNumber numberWithDouble:total];
}
- (void)parser:(PKParser *)p didMatchExpr_p:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
NSArray *toks = [a objectsAbove:nil];
double total = 1.0;
for (PKToken *tok in toks) {
total *= tok.floatValue;
}
a.target = [NSNumber numberWithDouble:total];
}
这是我得到的输出:
2012-04-06 22:54:31.975 Calculator[1070:207] -[CalculatorViewController parser:didMatchExpr_p:] [3, 4]3/*/4^+/4/*/8
2012-04-06 22:54:31.976 Calculator[1070:207] -[CalculatorViewController parser:didMatchExpr_p:] [4, 8]3/*/4/+/4/*/8^
2012-04-06 22:54:31.977 Calculator[1070:207] -[CalculatorViewController parser:didMatchExpr_s:] []3/*/4/+/4/*/8^
2012-04-06 22:54:31.977 Calculator[1070:207] -[CalculatorViewController parser:didMatchExpr_p:] [3, 4]3/*/4^+/4/*/8
2012-04-06 22:54:31.978 Calculator[1070:207] -[CalculatorViewController parser:didMatchExpr_p:] [4, 8]3/*/4/+/4/*/8^
2012-04-06 22:54:31.978 Calculator[1070:207] -[CalculatorViewController parser:didMatchExpr_s:] []3/*/4/+/4/*/8^
2012-04-06 22:54:31.979 Calculator[1070:207] res 0
为什么我的 res 为 0?
【问题讨论】:
-
Sadegh,我已经更新了下面的答案以匹配您修改后的问题。以后,如果您所问内容的细节发生重大变化,请考虑提出一个新问题。
标签: objective-c parsekit