def repl(hook): lineno = 0 tokens = [] while True: try: log = agentspeak.Log(agentspeak.get_logger(__name__), 3) if not tokens: line = agentspeak.util.prompt("agentspeak.parser >>> ") else: line = agentspeak.util.prompt("agentspeak.parser ... ") lineno += 1 tokens.extend(agentspeak.lexer.tokenize(agentspeak.StringSource("<stdin>", line), log, lineno)) while tokens: token_stream = iter(tokens) try: agent = parse_agent("<stdin>", token_stream, log, frozenset()) except StopIteration: log.throw() break else: log.throw() hook(agent) tokens = list(token_stream) except agentspeak.AggregatedError as error: print(str(error), file=sys.stderr) tokens = [] except KeyboardInterrupt: print() sys.exit(0)
def test_unexpected_eof(self): src = agentspeak.StringSource("<test>", "a") log = agentspeak.Log(agentspeak.get_logger(__name__), 3) tokens = agentspeak.lexer.TokenStream(src, log) with self.assertRaises(agentspeak.AggregatedError): agentspeak.parser.parse("<test>", tokens, log, frozenset())
def test_unify_return_value(self): src = agentspeak.StringSource("<test>", "+!p <- (X = 2) + 1 > 0.") log = agentspeak.Log(agentspeak.get_logger(__name__), 3) tokens = agentspeak.lexer.TokenStream(src, log) with self.assertRaises(agentspeak.AggregatedError): agentspeak.parser.parse("<test>", tokens, log, frozenset()) log.throw()
def test_rule_head_not_unifiable(self): src = agentspeak.StringSource("<test>", "rule(X + 1) :- true.") log = agentspeak.Log(agentspeak.get_logger(__name__), 3) tokens = agentspeak.lexer.TokenStream(src, log) agentspeak.parser.parse("<test>", tokens, log, frozenset()) with self.assertRaises(agentspeak.AggregatedError): log.throw()
def test_formula_type(self): src = agentspeak.StringSource("<test>", "+!plan <- ?true.") log = agentspeak.Log(agentspeak.get_logger(__name__), 3) tokens = agentspeak.lexer.TokenStream(src, log) agentspeak.parser.parse("<test>", tokens, log, frozenset()) with self.assertRaises(agentspeak.AggregatedError): log.throw()
def repl(agent, env, actions): lineno = 0 tokens = [] env = Environment() variables = {} intention = Intention() while True: try: log = agentspeak.Log(LOGGER, 3) try: if not tokens: line = agentspeak.util.prompt("%s >>> " % agent.name) else: line = agentspeak.util.prompt("%s ... " % agent.name) except KeyboardInterrupt: print() sys.exit(0) lineno += 1 tokens.extend( agentspeak.lexer.tokenize( agentspeak.StringSource("<stdin>", line), log, lineno)) while tokens: token_stream = iter(tokens) try: tok = next(token_stream) tok, body = agentspeak.parser.parse_plan_body( tok, token_stream, log) except StopIteration: log.throw() break else: log.throw() tokens = list(token_stream) intention.instr = Instruction(noop) body.accept( BuildInstructionsVisitor(variables, actions, intention.instr, log)) log.throw() agent.intentions.append(collections.deque([intention])) env.run_agent(agent) dump_variables(variables, intention.scope) except agentspeak.AggregatedError as error: print(str(error), file=sys.stderr) tokens = [] except agentspeak.AslError as error: LOGGER.error("%s", error) tokens = []
def repl(): lineno = 1 while True: try: line = agentspeak.util.prompt("agentspeak.lexer >>> ") main(agentspeak.StringSource("<stdin>", line), lineno) lineno += 1 except agentspeak.AggregatedError as error: print(str(error), file=sys.stderr) except KeyboardInterrupt: print() sys.exit(0)
def _wait(agent, term, intention): # Handle optional arguments. args = [agentspeak.grounded(arg, intention.scope) for arg in term.args] if len(args) == 2: event, millis = args else: if agentspeak.is_number(args[0]): millis = args[0] event = None else: millis = None event = args[0] # Type checks. if not (millis is None or agentspeak.is_number(millis)): raise agentspeak.AslError("expected timeout for .wait to be numeric") if not (event is None or agentspeak.is_string(event)): raise agentspeak.AslError("expected event for .wait to be a string") # Event. if event is not None: # Parse event. if not event.endswith("."): event += "." log = agentspeak.Log(LOGGER, 1) tokens = agentspeak.lexer.TokenStream( agentspeak.StringSource("<.wait>", event), log) tok, ast_event = agentspeak.parser.parse_event(tokens.next(), tokens, log) if tok.lexeme != ".": raise log.error( "expected no further tokens after event for .wait, got: '%s'", tok.lexeme, loc=tok.loc) # Build term. event = ast_event.accept(agentspeak.runtime.BuildEventVisitor(log)) # Timeout. if millis is None: until = None else: until = agent.env.time() + millis / 1000 # Create waiter. intention.waiter = agentspeak.runtime.Waiter(event=event, until=until) yield