/Fluidium/lib/ParseKit/test/TDPredicateEvaluator.m

https://github.com/livedo/fluidium · Objective C · 656 lines · 487 code · 119 blank · 50 comment · 40 complexity · 172be784d4601877caae968feb10e264 MD5 · raw file

  1. //
  2. // PKPredicateEvaluator.m
  3. // ParseKit
  4. //
  5. // Created by Todd Ditchendorf on 5/28/09.
  6. // Copyright 2009 Todd Ditchendorf. All rights reserved.
  7. //
  8. #import "TDPredicateEvaluator.h"
  9. #import "NSString+ParseKitAdditions.h"
  10. // expr = term orTerm*
  11. // orTerm = 'or' term
  12. // term = primaryExpr andPrimaryExpr*
  13. // andPrimaryExpr = 'and' primaryExpr
  14. // primaryExpr = phrase | '(' expression ')'
  15. // phrase = predicate | negatedPredicate
  16. // negatedPredicate = 'not' predicate
  17. // predicate = bool | eqPredicate | nePredicate | gtPredicate | gteqPredicate | ltPredicate | lteqPredicate | beginswithPredicate | containsPredicate | endswithPredicate | matchesPredicate
  18. // eqPredicate = attr '=' value
  19. // nePredicate = attr '!=' value
  20. // gtPredicate = attr '>' value
  21. // gteqPredicate = attr '>=' value
  22. // ltPredicate = attr '<' value
  23. // lteqPredicate = attr '<=' value
  24. // beginswithPredicate = attr 'beginswith' value
  25. // containsPredicate = attr 'contains' value
  26. // endswithPredicate = attr 'endswith' value
  27. // matchesPredicate = attr 'matches' value
  28. // attr = tag | Word
  29. // tag = '@' Word
  30. // value = QuotedString | Number | bool
  31. // bool = 'true' | 'false'
  32. @implementation TDPredicateEvaluator
  33. - (id)initWithDelegate:(id <TDPredicateEvaluatorDelegate>)d {
  34. if (self = [super init]) {
  35. delegate = d;
  36. }
  37. return self;
  38. }
  39. - (void)dealloc {
  40. delegate = nil;
  41. self.exprParser = nil;
  42. self.orTermParser = nil;
  43. self.termParser = nil;
  44. self.andPrimaryExprParser = nil;
  45. self.primaryExprParser = nil;
  46. self.negatedPredicateParser = nil;
  47. self.predicateParser = nil;
  48. self.phraseParser = nil;
  49. self.attrParser = nil;
  50. self.tagParser = nil;
  51. self.eqStringPredicateParser = nil;
  52. self.eqNumberPredicateParser = nil;
  53. self.eqBoolPredicateParser = nil;
  54. self.neStringPredicateParser = nil;
  55. self.neNumberPredicateParser = nil;
  56. self.neBoolPredicateParser = nil;
  57. self.gtPredicateParser = nil;
  58. self.gteqPredicateParser = nil;
  59. self.ltPredicateParser = nil;
  60. self.lteqPredicateParser = nil;
  61. self.beginswithPredicateParser = nil;
  62. self.containsPredicateParser = nil;
  63. self.endswithPredicateParser = nil;
  64. self.matchesPredicateParser = nil;
  65. self.valueParser = nil;
  66. self.boolParser = nil;
  67. self.trueParser = nil;
  68. self.falseParser = nil;
  69. self.stringParser = nil;
  70. self.numberParser = nil;
  71. [super dealloc];
  72. }
  73. - (BOOL)evaluate:(NSString *)s {
  74. PKAssembly *a = [PKTokenAssembly assemblyWithString:s];
  75. return [[[self.exprParser completeMatchFor:a] pop] boolValue];
  76. }
  77. // expression = term orTerm*
  78. - (PKCollectionParser *)exprParser {
  79. if (!exprParser) {
  80. self.exprParser = [PKSequence sequence];
  81. [exprParser add:self.termParser];
  82. [exprParser add:[PKRepetition repetitionWithSubparser:self.orTermParser]];
  83. }
  84. return exprParser;
  85. }
  86. // orTerm = 'or' term
  87. - (PKCollectionParser *)orTermParser {
  88. if (!orTermParser) {
  89. self.orTermParser = [PKSequence sequence];
  90. [orTermParser add:[[PKCaseInsensitiveLiteral literalWithString:@"or"] discard]];
  91. [orTermParser add:self.termParser];
  92. [orTermParser setAssembler:self selector:@selector(didMatchOr:)];
  93. }
  94. return orTermParser;
  95. }
  96. // term = primaryExpr andPrimaryExpr*
  97. - (PKCollectionParser *)termParser {
  98. if (!termParser) {
  99. self.termParser = [PKSequence sequence];
  100. [termParser add:self.primaryExprParser];
  101. [termParser add:[PKRepetition repetitionWithSubparser:self.andPrimaryExprParser]];
  102. }
  103. return termParser;
  104. }
  105. // andPrimaryExpr = 'and' primaryExpr
  106. - (PKCollectionParser *)andPrimaryExprParser {
  107. if (!andPrimaryExprParser) {
  108. self.andPrimaryExprParser = [PKSequence sequence];
  109. [andPrimaryExprParser add:[[PKCaseInsensitiveLiteral literalWithString:@"and"] discard]];
  110. [andPrimaryExprParser add:self.primaryExprParser];
  111. [andPrimaryExprParser setAssembler:self selector:@selector(didMatchAnd:)];
  112. }
  113. return andPrimaryExprParser;
  114. }
  115. // primaryExpr = phrase | '(' expression ')'
  116. - (PKCollectionParser *)primaryExprParser {
  117. if (!primaryExprParser) {
  118. self.primaryExprParser = [PKAlternation alternation];
  119. [primaryExprParser add:self.phraseParser];
  120. PKSequence *s = [PKSequence sequence];
  121. [s add:[[PKSymbol symbolWithString:@"("] discard]];
  122. [s add:self.exprParser];
  123. [s add:[[PKSymbol symbolWithString:@")"] discard]];
  124. [primaryExprParser add:s];
  125. }
  126. return primaryExprParser;
  127. }
  128. // phrase = predicate | negatedPredicate
  129. - (PKCollectionParser *)phraseParser {
  130. if (!phraseParser) {
  131. self.phraseParser = [PKAlternation alternation];
  132. [phraseParser add:self.predicateParser];
  133. [phraseParser add:self.negatedPredicateParser];
  134. }
  135. return phraseParser;
  136. }
  137. // negatedPredicate = 'not' predicate
  138. - (PKCollectionParser *)negatedPredicateParser {
  139. if (!negatedPredicateParser) {
  140. self.negatedPredicateParser = [PKSequence sequence];
  141. [negatedPredicateParser add:[[PKCaseInsensitiveLiteral literalWithString:@"not"] discard]];
  142. [negatedPredicateParser add:self.predicateParser];
  143. [negatedPredicateParser setAssembler:self selector:@selector(didMatchNegatedValue:)];
  144. }
  145. return negatedPredicateParser;
  146. }
  147. // predicate = bool | eqPredicate | nePredicate | gtPredicate | gteqPredicate | ltPredicate | lteqPredicate | beginswithPredicate | containsPredicate | endswithPredicate | matchesPredicate
  148. - (PKCollectionParser *)predicateParser {
  149. if (!predicateParser) {
  150. self.predicateParser = [PKAlternation alternation];
  151. [predicateParser add:self.boolParser];
  152. [predicateParser add:self.eqStringPredicateParser];
  153. [predicateParser add:self.eqNumberPredicateParser];
  154. [predicateParser add:self.eqBoolPredicateParser];
  155. [predicateParser add:self.neStringPredicateParser];
  156. [predicateParser add:self.neNumberPredicateParser];
  157. [predicateParser add:self.neBoolPredicateParser];
  158. [predicateParser add:self.gtPredicateParser];
  159. [predicateParser add:self.gteqPredicateParser];
  160. [predicateParser add:self.ltPredicateParser];
  161. [predicateParser add:self.lteqPredicateParser];
  162. [predicateParser add:self.beginswithPredicateParser];
  163. [predicateParser add:self.containsPredicateParser];
  164. [predicateParser add:self.endswithPredicateParser];
  165. [predicateParser add:self.matchesPredicateParser];
  166. }
  167. return predicateParser;
  168. }
  169. // attr = tag | Word
  170. - (PKCollectionParser *)attrParser {
  171. if (!attrParser) {
  172. self.attrParser = [PKAlternation alternation];
  173. [attrParser add:self.tagParser];
  174. [attrParser add:[PKWord word]];
  175. [attrParser setAssembler:self selector:@selector(didMatchAttr:)];
  176. }
  177. return attrParser;
  178. }
  179. // tag = '@' Word
  180. - (PKCollectionParser *)tagParser {
  181. if (!tagParser) {
  182. self.tagParser = [PKSequence sequence];
  183. [tagParser add:[[PKSymbol symbolWithString:@"@"] discard]];
  184. [tagParser add:[PKWord word]];
  185. }
  186. return tagParser;
  187. }
  188. // eqPredicate = attr '=' value
  189. - (PKCollectionParser *)eqStringPredicateParser {
  190. if (!eqStringPredicateParser) {
  191. self.eqStringPredicateParser = [PKSequence sequence];
  192. [eqStringPredicateParser add:self.attrParser];
  193. [eqStringPredicateParser add:[[PKSymbol symbolWithString:@"="] discard]];
  194. [eqStringPredicateParser add:self.stringParser];
  195. [eqStringPredicateParser setAssembler:self selector:@selector(didMatchEqStringPredicate:)];
  196. }
  197. return eqStringPredicateParser;
  198. }
  199. - (PKCollectionParser *)eqNumberPredicateParser {
  200. if (!eqNumberPredicateParser) {
  201. self.eqNumberPredicateParser = [PKSequence sequence];
  202. [eqNumberPredicateParser add:self.attrParser];
  203. [eqNumberPredicateParser add:[[PKSymbol symbolWithString:@"="] discard]];
  204. [eqNumberPredicateParser add:self.numberParser];
  205. [eqNumberPredicateParser setAssembler:self selector:@selector(didMatchEqNumberPredicate:)];
  206. }
  207. return eqNumberPredicateParser;
  208. }
  209. - (PKCollectionParser *)eqBoolPredicateParser {
  210. if (!eqBoolPredicateParser) {
  211. self.eqBoolPredicateParser = [PKSequence sequence];
  212. [eqBoolPredicateParser add:self.attrParser];
  213. [eqBoolPredicateParser add:[[PKSymbol symbolWithString:@"="] discard]];
  214. [eqBoolPredicateParser add:self.boolParser];
  215. [eqBoolPredicateParser setAssembler:self selector:@selector(didMatchEqBoolPredicate:)];
  216. }
  217. return eqBoolPredicateParser;
  218. }
  219. // nePredicate = attr '!=' value
  220. - (PKCollectionParser *)neStringPredicateParser {
  221. if (!neStringPredicateParser) {
  222. self.neStringPredicateParser = [PKSequence sequence];
  223. [neStringPredicateParser add:self.attrParser];
  224. [neStringPredicateParser add:[[PKSymbol symbolWithString:@"!="] discard]];
  225. [neStringPredicateParser add:self.stringParser];
  226. [neStringPredicateParser setAssembler:self selector:@selector(didMatchNeStringPredicate:)];
  227. }
  228. return neStringPredicateParser;
  229. }
  230. - (PKCollectionParser *)neNumberPredicateParser {
  231. if (!neNumberPredicateParser) {
  232. self.neNumberPredicateParser = [PKSequence sequence];
  233. [neNumberPredicateParser add:self.attrParser];
  234. [neNumberPredicateParser add:[[PKSymbol symbolWithString:@"!="] discard]];
  235. [neNumberPredicateParser add:self.numberParser];
  236. [neNumberPredicateParser setAssembler:self selector:@selector(didMatchNeNumberPredicate:)];
  237. }
  238. return neNumberPredicateParser;
  239. }
  240. - (PKCollectionParser *)neBoolPredicateParser {
  241. if (!neBoolPredicateParser) {
  242. self.neBoolPredicateParser = [PKSequence sequence];
  243. [neBoolPredicateParser add:self.attrParser];
  244. [neBoolPredicateParser add:[[PKSymbol symbolWithString:@"!="] discard]];
  245. [neBoolPredicateParser add:self.boolParser];
  246. [neBoolPredicateParser setAssembler:self selector:@selector(didMatchNeBoolPredicate:)];
  247. }
  248. return neBoolPredicateParser;
  249. }
  250. // gtPredicate = attr '>' value
  251. - (PKCollectionParser *)gtPredicateParser {
  252. if (!gtPredicateParser) {
  253. self.gtPredicateParser = [PKSequence sequence];
  254. [gtPredicateParser add:self.attrParser];
  255. [gtPredicateParser add:[[PKSymbol symbolWithString:@">"] discard]];
  256. [gtPredicateParser add:self.valueParser];
  257. [gtPredicateParser setAssembler:self selector:@selector(didMatchGtPredicate:)];
  258. }
  259. return gtPredicateParser;
  260. }
  261. // gteqPredicate = attr '>=' value
  262. - (PKCollectionParser *)gteqPredicateParser {
  263. if (!gteqPredicateParser) {
  264. self.gteqPredicateParser = [PKSequence sequence];
  265. [gteqPredicateParser add:self.attrParser];
  266. [gteqPredicateParser add:[[PKSymbol symbolWithString:@">="] discard]];
  267. [gteqPredicateParser add:self.valueParser];
  268. [gteqPredicateParser setAssembler:self selector:@selector(didMatchGteqPredicate:)];
  269. }
  270. return gteqPredicateParser;
  271. }
  272. // ltPredicate = attr '<' value
  273. - (PKCollectionParser *)ltPredicateParser {
  274. if (!ltPredicateParser) {
  275. self.ltPredicateParser = [PKSequence sequence];
  276. [ltPredicateParser add:self.attrParser];
  277. [ltPredicateParser add:[[PKSymbol symbolWithString:@"<"] discard]];
  278. [ltPredicateParser add:self.valueParser];
  279. [ltPredicateParser setAssembler:self selector:@selector(didMatchLtPredicate:)];
  280. }
  281. return ltPredicateParser;
  282. }
  283. // lteqPredicate = attr '<=' value
  284. - (PKCollectionParser *)lteqPredicateParser {
  285. if (!lteqPredicateParser) {
  286. self.lteqPredicateParser = [PKSequence sequence];
  287. [lteqPredicateParser add:self.attrParser];
  288. [lteqPredicateParser add:[[PKSymbol symbolWithString:@"<="] discard]];
  289. [lteqPredicateParser add:self.valueParser];
  290. [lteqPredicateParser setAssembler:self selector:@selector(didMatchLteqPredicate:)];
  291. }
  292. return lteqPredicateParser;
  293. }
  294. // beginswithPredicate = attr 'beginswith' value
  295. - (PKCollectionParser *)beginswithPredicateParser {
  296. if (!beginswithPredicateParser) {
  297. self.beginswithPredicateParser = [PKSequence sequence];
  298. [beginswithPredicateParser add:self.attrParser];
  299. [beginswithPredicateParser add:[[PKCaseInsensitiveLiteral literalWithString:@"beginswith"] discard]];
  300. [beginswithPredicateParser add:self.valueParser];
  301. [beginswithPredicateParser setAssembler:self selector:@selector(didMatchBeginswithPredicate:)];
  302. }
  303. return beginswithPredicateParser;
  304. }
  305. // containsPredicate = attr 'contains' value
  306. - (PKCollectionParser *)containsPredicateParser {
  307. if (!containsPredicateParser) {
  308. self.containsPredicateParser = [PKSequence sequence];
  309. [containsPredicateParser add:self.attrParser];
  310. [containsPredicateParser add:[[PKCaseInsensitiveLiteral literalWithString:@"contains"] discard]];
  311. [containsPredicateParser add:self.valueParser];
  312. [containsPredicateParser setAssembler:self selector:@selector(didMatchContainsPredicate:)];
  313. }
  314. return containsPredicateParser;
  315. }
  316. // endswithPredicate = attr 'endswith' value
  317. - (PKCollectionParser *)endswithPredicateParser {
  318. if (!endswithPredicateParser) {
  319. self.endswithPredicateParser = [PKSequence sequence];
  320. [endswithPredicateParser add:self.attrParser];
  321. [endswithPredicateParser add:[[PKCaseInsensitiveLiteral literalWithString:@"endswith"] discard]];
  322. [endswithPredicateParser add:self.valueParser];
  323. [endswithPredicateParser setAssembler:self selector:@selector(didMatchEndswithPredicate:)];
  324. }
  325. return endswithPredicateParser;
  326. }
  327. // matchesPredicate = attr 'matches' value
  328. - (PKCollectionParser *)matchesPredicateParser {
  329. if (!matchesPredicateParser) {
  330. self.matchesPredicateParser = [PKSequence sequence];
  331. [matchesPredicateParser add:self.attrParser];
  332. [matchesPredicateParser add:[[PKCaseInsensitiveLiteral literalWithString:@"matches"] discard]];
  333. [matchesPredicateParser add:self.valueParser];
  334. [matchesPredicateParser setAssembler:self selector:@selector(didMatchMatchesPredicate:)];
  335. }
  336. return matchesPredicateParser;
  337. }
  338. // value = QuotedString | Number | bool
  339. - (PKCollectionParser *)valueParser {
  340. if (!valueParser) {
  341. self.valueParser = [PKAlternation alternation];
  342. [valueParser add:self.stringParser];
  343. [valueParser add:self.numberParser];
  344. [valueParser add:self.boolParser];
  345. }
  346. return valueParser;
  347. }
  348. - (PKCollectionParser *)boolParser {
  349. if (!boolParser) {
  350. self.boolParser = [PKAlternation alternation];
  351. [boolParser add:self.trueParser];
  352. [boolParser add:self.falseParser];
  353. [boolParser setAssembler:self selector:@selector(didMatchBool:)];
  354. }
  355. return boolParser;
  356. }
  357. - (PKParser *)trueParser {
  358. if (!trueParser) {
  359. self.trueParser = [[PKCaseInsensitiveLiteral literalWithString:@"true"] discard];
  360. [trueParser setAssembler:self selector:@selector(didMatchTrue:)];
  361. }
  362. return trueParser;
  363. }
  364. - (PKParser *)falseParser {
  365. if (!falseParser) {
  366. self.falseParser = [[PKCaseInsensitiveLiteral literalWithString:@"false"] discard];
  367. [falseParser setAssembler:self selector:@selector(didMatchFalse:)];
  368. }
  369. return falseParser;
  370. }
  371. - (PKParser *)stringParser {
  372. if (!stringParser) {
  373. self.stringParser = [PKQuotedString quotedString];
  374. [stringParser setAssembler:self selector:@selector(didMatchString:)];
  375. }
  376. return stringParser;
  377. }
  378. - (PKParser *)numberParser {
  379. if (!numberParser) {
  380. self.numberParser = [PKNumber number];
  381. [numberParser setAssembler:self selector:@selector(didMatchNumber:)];
  382. }
  383. return numberParser;
  384. }
  385. - (void)didMatchAnd:(PKAssembly *)a {
  386. NSNumber *b2 = [a pop];
  387. NSNumber *b1 = [a pop];
  388. BOOL yn = ([b1 boolValue] && [b2 boolValue]);
  389. [a push:[NSNumber numberWithBool:yn]];
  390. }
  391. - (void)didMatchOr:(PKAssembly *)a {
  392. NSNumber *b2 = [a pop];
  393. NSNumber *b1 = [a pop];
  394. BOOL yn = ([b1 boolValue] || [b2 boolValue]);
  395. [a push:[NSNumber numberWithBool:yn]];
  396. }
  397. - (void)didMatchEqStringPredicate:(PKAssembly *)a {
  398. NSString *value = [a pop];
  399. NSString *attrKey = [a pop];
  400. BOOL yn = [[delegate valueForAttributeKey:attrKey] isEqual:value];
  401. [a push:[NSNumber numberWithBool:yn]];
  402. }
  403. - (void)didMatchEqNumberPredicate:(PKAssembly *)a {
  404. NSNumber *value = [a pop];
  405. NSString *attrKey = [a pop];
  406. BOOL yn = [value isEqualToNumber:[delegate valueForAttributeKey:attrKey]];
  407. [a push:[NSNumber numberWithBool:yn]];
  408. }
  409. - (void)didMatchEqBoolPredicate:(PKAssembly *)a {
  410. NSNumber *b = [a pop];
  411. NSString *attrKey = [a pop];
  412. BOOL yn = ([delegate boolForAttributeKey:attrKey] == [b boolValue]);
  413. [a push:[NSNumber numberWithBool:yn]];
  414. }
  415. - (void)didMatchNeStringPredicate:(PKAssembly *)a {
  416. NSString *value = [a pop];
  417. NSString *attrKey = [a pop];
  418. BOOL yn = ![[delegate valueForAttributeKey:attrKey] isEqual:value];
  419. [a push:[NSNumber numberWithBool:yn]];
  420. }
  421. - (void)didMatchNeNumberPredicate:(PKAssembly *)a {
  422. NSNumber *value = [a pop];
  423. NSString *attrKey = [a pop];
  424. BOOL yn = ![value isEqualToNumber:[delegate valueForAttributeKey:attrKey]];
  425. [a push:[NSNumber numberWithBool:yn]];
  426. }
  427. - (void)didMatchNeBoolPredicate:(PKAssembly *)a {
  428. NSNumber *b = [a pop];
  429. NSString *attrKey = [a pop];
  430. BOOL yn = ([delegate boolForAttributeKey:attrKey] != [b boolValue]);
  431. [a push:[NSNumber numberWithBool:yn]];
  432. }
  433. - (void)didMatchGtPredicate:(PKAssembly *)a {
  434. NSNumber *value = [a pop];
  435. NSString *attrKey = [a pop];
  436. BOOL yn = (NSOrderedDescending == [[delegate valueForAttributeKey:attrKey] compare:value]);
  437. [a push:[NSNumber numberWithBool:yn]];
  438. }
  439. - (void)didMatchGteqPredicate:(PKAssembly *)a {
  440. NSNumber *value = [a pop];
  441. NSString *attrKey = [a pop];
  442. BOOL yn = (NSOrderedAscending != [[delegate valueForAttributeKey:attrKey] compare:value]);
  443. [a push:[NSNumber numberWithBool:yn]];
  444. }
  445. - (void)didMatchLtPredicate:(PKAssembly *)a {
  446. NSNumber *value = [a pop];
  447. NSString *attrKey = [a pop];
  448. BOOL yn = (NSOrderedAscending == [[delegate valueForAttributeKey:attrKey] compare:value]);
  449. [a push:[NSNumber numberWithBool:yn]];
  450. }
  451. - (void)didMatchLteqPredicate:(PKAssembly *)a {
  452. NSNumber *value = [a pop];
  453. NSString *attrKey = [a pop];
  454. BOOL yn = (NSOrderedDescending != [[delegate valueForAttributeKey:attrKey] compare:value]);
  455. [a push:[NSNumber numberWithBool:yn]];
  456. }
  457. - (void)didMatchBeginswithPredicate:(PKAssembly *)a {
  458. NSString *value = [a pop];
  459. NSString *attrKey = [a pop];
  460. BOOL yn = [[delegate valueForAttributeKey:attrKey] hasPrefix:value];
  461. [a push:[NSNumber numberWithBool:yn]];
  462. }
  463. - (void)didMatchContainsPredicate:(PKAssembly *)a {
  464. NSString *value = [a pop];
  465. NSString *attrKey = [a pop];
  466. NSRange r = [[delegate valueForAttributeKey:attrKey] rangeOfString:value];
  467. BOOL yn = (NSNotFound != r.location);
  468. [a push:[NSNumber numberWithBool:yn]];
  469. }
  470. - (void)didMatchEndswithPredicate:(PKAssembly *)a {
  471. NSString *value = [a pop];
  472. NSString *attrKey = [a pop];
  473. BOOL yn = [[delegate valueForAttributeKey:attrKey] hasSuffix:value];
  474. [a push:[NSNumber numberWithBool:yn]];
  475. }
  476. - (void)didMatchMatchesPredicate:(PKAssembly *)a {
  477. NSString *value = [a pop];
  478. NSString *attrKey = [a pop];
  479. BOOL yn = [[delegate valueForAttributeKey:attrKey] isEqual:value]; // TODO should this be a regex match?
  480. [a push:[NSNumber numberWithBool:yn]];
  481. }
  482. - (void)didMatchAttr:(PKAssembly *)a {
  483. [a push:[[a pop] stringValue]];
  484. }
  485. - (void)didMatchNegatedValue:(PKAssembly *)a {
  486. NSNumber *b = [a pop];
  487. [a push:[NSNumber numberWithBool:![b boolValue]]];
  488. }
  489. - (void)didMatchBool:(PKAssembly *)a {
  490. NSNumber *b = [a pop];
  491. [a push:[NSNumber numberWithBool:[b boolValue]]];
  492. }
  493. - (void)didMatchTrue:(PKAssembly *)a {
  494. [a push:[NSNumber numberWithBool:YES]];
  495. }
  496. - (void)didMatchFalse:(PKAssembly *)a {
  497. [a push:[NSNumber numberWithBool:NO]];
  498. }
  499. - (void)didMatchString:(PKAssembly *)a {
  500. NSString *s = [[[a pop] stringValue] stringByTrimmingQuotes];
  501. [a push:s];
  502. }
  503. - (void)didMatchNumber:(PKAssembly *)a {
  504. NSNumber *b = [NSNumber numberWithFloat:[(PKToken *)[a pop] floatValue]];
  505. [a push:b];
  506. }
  507. @synthesize exprParser;
  508. @synthesize orTermParser;
  509. @synthesize termParser;
  510. @synthesize andPrimaryExprParser;
  511. @synthesize primaryExprParser;
  512. @synthesize phraseParser;
  513. @synthesize negatedPredicateParser;
  514. @synthesize predicateParser;
  515. @synthesize attrParser;
  516. @synthesize tagParser;
  517. @synthesize eqStringPredicateParser;
  518. @synthesize eqNumberPredicateParser;
  519. @synthesize eqBoolPredicateParser;
  520. @synthesize neStringPredicateParser;
  521. @synthesize neNumberPredicateParser;
  522. @synthesize neBoolPredicateParser;
  523. @synthesize gtPredicateParser;
  524. @synthesize gteqPredicateParser;
  525. @synthesize ltPredicateParser;
  526. @synthesize lteqPredicateParser;
  527. @synthesize beginswithPredicateParser;
  528. @synthesize containsPredicateParser;
  529. @synthesize endswithPredicateParser;
  530. @synthesize matchesPredicateParser;
  531. @synthesize valueParser;
  532. @synthesize boolParser;
  533. @synthesize trueParser;
  534. @synthesize falseParser;
  535. @synthesize stringParser;
  536. @synthesize numberParser;
  537. @end