def extendProtocol(lexicalFactory, syntaxFactory):
	# j == join
	# p == part
	# l == lookup
	# a == lookup answer
	regex = "group:(({0})|({1})|({2})|({3}))".format(
			"(j|l|p):{0}".format(GroupNameRegex),
			"a:{0}(:{1}(,[1-9][0-9]?)+)+".format(GroupNameRegex, IPHostRegex),
			"msg:{0}:[0-9]+:(s|a):.+".format(GroupNameRegex),
			"e:.*"
	)

	if ExtensionLoader().isActive("BasicOverlay"):
		BProtocol = ExtensionLoader().getExtension("BasicOverlay")
		BProtocol.addBootstrapFunction(joinGroups)

		establishedState = lexicalFactory.getState('established')
		establishedState.addTransition('established', regex,
										lambda t: t.split(':'))

		startState = lexicalFactory.getState('start')
		startState.addTransition('start', regex, lambda t: t.split(':'))

		syntaxFactory.addToken('group', groupTokenParser)
		overlayAHF(removeFromGroups, True)

		for g in CommandLineParser().getArguments().groupsToJoin:
			groups[g] = Group(g, True, None,
								CommandLineParser().getArguments().PeerName)

		return True

	return False
def extendProtocol(lexicalFactory, syntaxFactory):

	startS = lexicalFactory.getState('start')
	establishedS = lexicalFactory.addState('established')

	lexicalFactory.addState('finished')

	syntaxFactory.addToken('c', connectionTokenParser)
	syntaxFactory.addToken('e', errorTokenParser)

	startS.addTransition('established','c:(a|e|n):' +
						 HostNameRegex +':([0-9]+,?)+',
						 lambda t: t.split(':'))

	establishedS.addTransition('finished', 'b:(o|e):[a-zA-Z]+',
								lambda t: t.split(':'))

	establishedS.addTransition('established','p:(n|u):[0-9]+\.[0-9]+',
								lambda t: t.split(':'))

	establishedS.addTransition('established','e:.+',
								lambda t: t.split(':'))

	overlayAHF(removeFromPeerList)
	overlayCBF(requestConnection)

	return True