public HashMap<String, TreeSet<String>> parse(BufferedReader br) {
		
		// functionMapIntra (function, caller set) is initialed
		HashMap<String, TreeSet<String>> functionMapIntra = new HashMap<String, TreeSet<String>>();
		String currentLine = null;
		String currentNode = null;

		// update
		String key = "";
		boolean check = false;

		try {
			while ((currentLine = br.readLine()) != null) {

				// We're at a new node
				Matcher nodeMatcher = nodePattern.matcher(currentLine);
				if (nodeMatcher.find()) {
					currentNode = nodeMatcher.group(1);

					// update
					key = currentNode;
					check = true;
				}

				// We're at a callsite within currentNode
				Matcher callsiteMatcher = callsitePattern.matcher(currentLine);
				// First node in callgraph is a null function

				// update
				if (check == false && callsiteMatcher.find()) {
					String callee = callsiteMatcher.group(2);
					functionMapIntra.put(callee, new TreeSet<String>());
				}

				if (callsiteMatcher.find() && currentNode != null) {

					// update
					String callee = callsiteMatcher.group(2);
					if (functionMapIntra.get(callee) == null) {
						functionMapIntra.put(callee, new TreeSet<String>());
					}
					
					// add (function, caller set) in the map
					functionMapIntra.get(callee).add(key);
				}

				// System.out.println(currentLine);
			}
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(-1);
		}
		
		return functionMapIntra;
	}