1 ///
2 /// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
3 /// Use of this file is governed by the BSD 3-clause license that
4 /// can be found in the LICENSE.txt file in the project root.
5 ///
6 
7 
8 ///
9 /// A semantic predicate failed during validation.  Validation of predicates
10 /// occurs when normally parsing the alternative just like matching a token.
11 /// Disambiguating predicate evaluation occurs when we test a predicate during
12 /// prediction.
13 ///
14 public class FailedPredicateException: RecognitionException {
15 	private let ruleIndex: Int
16 	private let predicateIndex: Int
17 	private let predicate: String?
18 
19 	public init(_ recognizer: Parser, _ predicate: String? = nil, _ message: String? = nil) {
20 		let s = recognizer.getInterpreter().atn.states[recognizer.getState()]!
21 
22 		let trans = s.transition(0) as! AbstractPredicateTransition
23 		if let predex = trans as? PredicateTransition {
24 			self.ruleIndex = predex.ruleIndex
25 			self.predicateIndex = predex.predIndex
26 		}
27 		else {
28 			self.ruleIndex = 0
29 			self.predicateIndex = 0
30 		}
31 
32 		self.predicate = predicate
33 
34         super.init(recognizer, recognizer.getInputStream()!, recognizer._ctx, FailedPredicateException.formatMessage(predicate, message))
35         if let token = try? recognizer.getCurrentToken() {
36             setOffendingToken(token)
37         }
38 	}
39 
getRuleIndexnull40 	public func getRuleIndex() -> Int {
41 		return ruleIndex
42 	}
43 
getPredIndexnull44 	public func getPredIndex() -> Int {
45 		return predicateIndex
46 	}
47 
getPredicatenull48 	public func getPredicate() -> String? {
49 		return predicate
50 	}
51 
52 
formatMessagenull53 	private static func formatMessage(_ predicate: String?, _ message: String?) -> String {
54 		if message != nil {
55 			return message!
56 		}
57 
58         let predstr = predicate ?? "<unknown>"
59 		return "failed predicate: {\(predstr)}?"
60 	}
61 }
62