Next: QuLog Index, Previous: Listing of Builtin Types, Up: Top [Contents][Index]
(* The EBNF grammar for qulog/teleor *)
(*
Notation used as in:
https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
We assume the following non-terminals that group tokens. All other
tokens in the grammar are given as strings.
atom: the allowed atoms of qulog
string: double-quoted strings
var: the variables of qulog
int: integers
float: floating point numbers
*)
anynum = int | float;
(* ------ query ------ *)
query =
(
( int, "of", var_seq, "::", basic_query ) |
( int, "of", basic_query ) |
( int, "of", "exists", var_seq, conditions ) |
( var_seq, "::", basic_query ) |
( "exists", var_seq, conditions ) |
basic_query
);
basic_query =
( "prolog" ) |
( "bs" ) |
( "logging", atom ) |
( "logging", "(", atom , ")" ) |
( "logging", atom, "@", atom ) |
( "logging", "(", atom, "@", atom , ")" ) |
( "unlog" ) |
( "types", {atom_seq} ) |
( "stypes", {atom_seq} ) |
( "show", {atom_seq} ) |
( "watch", {atom_seq} ) |
( "watch", "(", {atom_seq}, ")" ) |
( "unwatch", {atom_seq} ) |
( "unwatch", "(", {atom_seq}, ")" ) |
( "watched" ) |
( "answers", int ) |
( "consult", atom ) |
( "consult", "(", atom, ")" ) |
( "pconsult", atom ) |
( "pconsult", "(", atom, ")" ) |
( "[", atom, "]" ) |
conditions |
action_seq;
(* ------ program item ------ *)
(* Note: a program file is parsed one program item at a time *)
program_item =
( "?-", term ) |
enum_definition |
macro_definition |
declaration |
( compound_term, rel_rule_body ) |
( compound_term, act_rule_body ) |
( compound_term, fun_rule_body ) |
( simple_compound, tel_procedure_body );
(* ------ type definitions ------ *)
enum_definition = "def", definition_head, "::=", enum_type {string};
macro_definition = "def", definition_head, "==", macro_type {string};
(* either atom type or polymorphic type with args *)
definition_head = atom | ( atom, bracketed_var_seq );
(* ------ types ------ *)
enum_type =
( int, "..", int ) |
( atom, "|", atom, {"|", atom} ) |
( string, "|", string , {"|", string} ) |
( anynum, "|", anynum, {"|", anynum} ) |
( simple_compound, {"|", simple_compound} ) |
( "(", enum_type, ")" ) ;
macro_type =
( atom_or_simple_compound, "||",
atom_or_simple_compound, {"||", atom_or_simple_compound} ) |
macro_type_expression;
macro_type_expression =
simple_type_compound |
atom |
( "(", type_expression, ",", type_expression,
{",", type_expression}, ")" ) |
code_type_expression;
type_expression =
code_type_expression |
var |
simple_type_compound |
atom |
( "(", type_expression, ")" ) |
( "(", type_expression, ",", type_expression,
{",", type_expression}, ")" );
code_type_expression =
fun_type_expression |
dyn_type_expression |
rel_type_expression |
act_type_expression |
tel_type_expression;
fun_type_expression =
( "fun", bracketed_type_seq, "->", type_expression ) ;
rel_type_expression =
( "rel", bracketed_annotated_type_seq);
dyn_type_expression =
( "dyn", bracketed_type_seq);
act_type_expression =
( "act", bracketed_annotated_type_seq);
tel_type_expression =
( "tel", bracketed_type_seq);
bracketed_type_seq =
( "(", ")" ) |
( "(", type_expression, { ",", type_expression}, ")" );
mode_annotation = "!" | "?" | "??" | "@";
bracketed_annotated_type_seq =
( "(", ")" ) |
( "(", annotated_type_expression,
{ ",", annotated_type_expression}, ")" );
annotated_type_expression =
mode_annotation |
( mode_annotation , inner_annotated_type_expression ) |
inner_annotated_type_expression;
inner_annotated_type_expression =
type_expression |
( atom, bracketed_annotated_type_seq);
(* ------ declarations ------ *)
declaration =
( "fun", fun_declaration, {",", fun_declaration}, [ string ] ) |
( "act", annotated_declaration, {",", annotated_declaration}, [string]) |
( "rel", annotated_declaration, {",", annotated_declaration}, [string]) |
( "dyn", unannotated_declaration,
{",", unannotated_declaration}, [ string ] ) |
( "mrel", annotated_declaration,
{",", annotated_declaration}, [ string ] ) |
( "mfun", fun_declaration, {",", fun_declaration}, [ string ] ) |
( ( "tel" | "start_tel" | "atomic_tel" ), unannotated_declaration,
{",", unannotated_declaration}, [ string ] ) |
( "percept", unannotated_declaration,
{",", unannotated_declaration}, [ string ] ) |
global_num_declaration;
fun_declaration =
unannotated_declaration, "->", type_expression;
unannotated_declaration =
atom, (
( "(", ")" ) |
( "(", [var, ":"], type_expression, ["default", term],
{ ",", [var, ":"], type_expression}, ")" )
);
annotated_declaration =
atom, (
( "(", ")" ) |
( "(", [var, ":"], annotated_type_expression, ["default", term],
{ ",", [var, ":"],
annotated_type_expression, ["default", term]}, ")" )
);
global_num_declaration =
("int", atom, ":=", int) |
("num", atom, ":=", num);
(* ------ rule definitions ------ *)
rel_rule_body =
["::", conditions], ["<=", conditions];
act_rule_body =
["::", conditions], "~>", action_seq;
fun_rule_body =
["::", conditions], "->", term;
tel_procedure_body =
"{", ">>>", tel_rule, { tel_rule }, "<<<", { tel_rule }, "}" |
"{", tel_rule, { tel_rule }, "}";
(* ------ conjunction and conditions ------ *)
conditions = a_condition, { "&", a_condition };
a_condition =
( "forall", var_seq,
"(", exists_conditions, "=>", exists_conditions, ")" ) |
( "not", exists_a_condition ) |
( "not", "(", exists_conditions, ")" ) |
( "once", a_condition ) |
( "once", "(", conditions, ")" ) |
( "(", int, "of", var_type_seq, "::",
exists_conditions__, ")", ")" , "query_at", pedro_handle ) |
("(", var_type_seq, "::",
exists_conditions__, ")", "query_at", pedro_handle ) |
( simple_condition, "query_at", pedro_handle ) |
simple_condition;
exists_a_condition =
( "exists", var_seq, simple_condition ) |
a_condition;
exists_conditions =
( "exists", var_seq, a_condition ) | conditions;
simple_condition =
( "(", conditions, ")" ) |
"true" | "false" |
( "type", "(", term, ",", annotated_type_expression, ")" ) |
( "listof", "(", term, ",", term, "::", exists_conditions, ")" ) |
compound_term |
( term, "=?", qeqrhs) |
( term, test_op, term );
qeqrhs =
( qeqrhs_string_term, "++", qeqrhs_string_term,
{"++", qeqrhs_string_term} ) |
( qeqrhs_list_term, "<>", qeqrhs_list_term, {"<>", qeqrhs_list_term} );
qeqrhs_string_term =
( simple_string_term, "::", conditions ) |
simple_string_term;
qeqrhs_list_term =
( simple_list_term, "::", conditions ) |
simple_list_term;
(* ------ actions ------ *)
action_seq = action, {";", action};
action =
( "forall", var_seq, "{",
exists_conditions, "~>", action_seq, "}") |
simple_action ;
simple_action =
( "{", "}" ) |
( "{", action_seq, "}" ) |
( "atomic_action", simple_action ) |
( "case", "{", case_alt, { case_alt }, "}" ) |
( "wait", "(", conditions, ")" ) |
( "wait_case", "{", case_alt, { case_alt },
[ "timeout", term, "~>", action_seq ], "}" ) |
( "receive", "{", receive_alt, { receive_alt },
[ "timeout", term, "~>", action_seq ], "}" ) |
( "try", action_seq, "except", "{", except_alt, { except_alt }, "}" ) |
( "repeat", simple_action, [ "until", a_condition ] ) |
( "?", "(", exists_conditions, ")" ) |
( term, "from", agent_handle, ["::", conditions ] ) |
( term, "from_thread", pedro_handle, ["::", conditions ] ) |
tr_pp_action;
case_alt =
conditions, "~>", action_seq;
receive_alt =
( term, "from", agent_handle, [ "::", conditions ], "~>", action_seq ) |
( term, "from_thread", pedro_handle, [ "::", conditions ],
"~>", action_seq ) |
( "query", term, "from_thread", pedro_handle, [ "::", conditions ],
"~>", action_seq );
except_alt =
term, [ "::", conditions ], "~>", action_seq;
(* ------ TR rule ------ *)
tel_rule =
( tr_rule_LHS, "~+>", tr_pp_action) |
tr_rule_LHS, "~>", tr_rule_RHS;
tr_rule_LHS =
conditions,
[( "commit_while", while_commit) | ("or_while", while_commit)];
while_commit =
conditions |
( "min_time", term ) |
(conditions, "min_time", term );
tr_rule_RHS = tr_action, [ "++", simple_tr_pp_action ];
tr_action =
( "(", ")" ) |
( simple_tr_action, {",", simple_tr_action} ) |
( "(", simple_tr_action, {",", simple_tr_action}, ")" ) |
( "[", tr_timed_seq, "]" );
tr_timed_seq =
simple_tr_action, ":", term, {",", simple_tr_action, ":", term },
[",", simple_tr_action];
simple_tr_action = var | compound_term;
tr_pp_action =
simple_tr_pp_action |
( "{" simple_tr_pp_action { ";" simple_tr_pp_action } "}" )
simple_tr_pp_action =
( term, "to", agent_handle ) |
( term, "to_thread", pedro_handle ) |
( atom, global_num_op, term) |
compound_term;
(* ------ term ------ *)
term =
simple_term |
( simple_term, "<>", simple_term, { "<>", simple_term } ) |
( simple_term, "++", simple_term, { "++", simple_term } ) |
( simple_term, set_op, simple_term, { set_op, simple_term } ) |
( simple_term, arith_op, simple_term, { arith_op, simple_term } );
simple_term =
var |
atom |
anynum |
string |
compound_term |
agent_handle | pedro_handle |
( "(", term, ")" ) |
( tuple ) |
( "$", atom ) |
set_term |
set_comprehension |
list_term |
list_comprehension |
( "-", simple_term ) |
( "#", simple_term );
set_comprehension =
"{", simple_term, "::", exists_conditions, "}";
list_comprehension =
( "[", simple_term, "::", exists_conditions, "]" );
(* ------ auxilary rules -------*)
atom_seq = atom, {",", atom};
var_seq = ( var, {",", var} ) | ( "(", var, {",", var}, ")" );
var_type_seq = ( var, ":", type_expression,
{",", var,":", type_expression} ) |
( "(", var, ":", type_expression,
{",", var,":", type_expression}, ")" );
atom_or_simple_compound = atom | simple_compound;
simple_compound = atom, bracketed_arg_seq;
simple_type_compound = atom, bracketed_type_arg_seq;
compound_term = ( atom | var ), bracketed_arg_seq, { bracketed_arg_seq };
(* compound means ultimate functor is an atom *)
bracketed_arg_seq = ("(", { term, "," }, ")") | ("(", arg_seq, ")");
bracketed_type_arg_seq = ("(", type_expression, {",", type_expression}, ")");
tuple = ( "(", ")" ) | ("(", term, ",", arg_seq, ")");
bracketed_var_seq = ("(", ")") | ("(", var_seq, ")");
arg_seq = term, {",", term};
test_op =
"=" | "==" | "\=" | "=@" | ">" | "<" | ">=" | "=<" |
"@>" | "@<" | "@>=" | "@=<" | "in";
global_num_op =
":=" | "+:=" | "-:=";
simple_string_term =
string | var | ( var, "/", ( string | var ) ) | compound_term;
simple_list_term =
var | compound_term | list_term | list_comprehension ;
set_term =
( "{", "}" ) |
( "{", arg_seq, "}" );
list_term =
( "[", "]" ) |
"[", term, list_tail;
list_tail =
"]" |
( "|", term, "]" ) |
( ",..", "]" ) |
( ",..", term, "]" ) |
( term, ",", list_tail );
pedro_handle = (atom | var), [":", (atom | var)], ["@", (atom | var)];
agent_handle = (atom | var), ["@", (atom | var)];
set_op = "union" | "diff" | "inter";
arith_op =
"**" | "*" | "+" | "-" | "/" | "//" | ">>" | "<<" |
"mod" | "rem" | "/\\" | "\\/";
Next: QuLog Index, Previous: Listing of Builtin Types, Up: Top [Contents][Index]