def test(): """Test by parsing some text.""" # Connect to the local socket and send sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("localhost", DEFAULT_PORT)) while True: try: text = raw_input("> ") except KeyboardInterrupt: break msg = socket_parse(asocket=sock, text=text) if not msg: print "Connection to server closed." break print msg
def generate(self, text, sensors, regions, props): """Generate a logical specification from natural language and propositions.""" # Clean unicode out of everything text = text.encode('ascii', 'ignore') sensors = [astr.encode('ascii', 'ignore') for astr in sensors] regions = [astr.encode('ascii', 'ignore') for astr in regions] props = [astr.encode('ascii', 'ignore') for astr in props] print "NL->LTL Generation called on:" print "Sensors:", sensors print "Props:", props print "Regions:", regions print "Text:", repr(text) # Make lists for POS conversions, including the metapar keywords force_nouns = list(regions) + list(sensors) force_verbs = list(props) + METAPARS.keys() responses = [] system_lines = [] env_lines = [] env_lines_set = set() # Used to track duplicates custom_props = set() generation_trees = [] for line in text.split('\n'): if not line: # Blank lines are counted as being processed correctly but are skipped responses.append(True) continue # Init the generation tree to the empty result generation_tree = [line.strip(), []] # Lowercase and strip the text before using it line = line.strip().lower() print "Sending to remote parser:", repr(line) parse = socket_parse(asocket=self.sock, text=line, force_nouns=force_nouns, force_verbs=force_verbs) print parse user_response, semantics_result, semantics_response, new_commands = \ self.world_knowledge.process_parse_tree(parse, line) # Build the metapars failure = False for command in new_commands: try: new_sys_lines, new_env_lines, new_custom_props = _apply_metapar(command) except KeyError: failure = True continue system_lines.extend(new_sys_lines) # We need to ensure no duplicates are inserted into env_lines, so we keep # an redundant set. If we were requiring 2.7 we would use OrderedDict. for env_line in new_env_lines: if env_line not in env_lines_set: env_lines.append(env_line) env_lines_set.add(env_line) custom_props.update(new_custom_props) # Add the statements as the children of the generation tree generation_tree[1].append([str(command), [new_env_lines, new_sys_lines]]) # Add a true response if there were commands and no failures responses.append(new_commands and not failure) # Add this line's stuff to the generation tree generation_trees.append(generation_tree) # Convert custom props into a list custom_props = list(custom_props) print "Spec generation complete." print "Responses:", responses print "Environment lines:", env_lines print "System lines:", system_lines print "Custom props:", custom_props print "Generation tree:", generation_trees return env_lines, system_lines, custom_props, responses, generation_trees