     let messsages: [MessageContext]
     let structs: [StructContext]
     let EOF: RecognizedToken
+    
+    let tokens: [RecognizedToken]
+    var text: String {
+        get {
+            return tokens.reduce("") { (soFar, soGood) in
+                return soFar + soGood.string
+            }
+        }
+    }
     
     static func consume(tokens: [RecognizedToken]) throws -> (consumedIndex: Array<RecognizedToken>.Index, context: EntryContext) {
         let contextStart = skipNLAndWS(tokens: tokens, from: tokens.startIndex)

                break
            }
        }
        return (consumedIndex, URIContext(components: components))
    }
}


            identifier = nil
        }
        guard identifier == nil else {
            return (consumedIndex, URIPathComponentContext(SLASH: slashToken, identifier: identifier, param: nil, tokens: tokens.subarray(range: Range(uncheckedBounds: (contextStart, consumedIndex)))))
        }
        //consume param
        let (paramConsumed, paramContext) = try ParamInUriContext.consume(tokens: tokens.subarray(from: consumedIndex))
        consumedIndex = tokens.index(consumedIndex, offsetBy: paramConsumed)
        return (consumedIndex, URIPathComponentContext(SLASH: slashToken, identifier: nil, param: paramContext, tokens: tokens.subarray(range: Range(uncheckedBounds: (contextStart, consumedIndex)))))
    }
}

