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