Grammar

The Logtalk grammar is here described using Backus-Naur Form syntax. Non-terminal symbols in italics have the defintion found in the ISO Prolog Standard. Terminal symbols are represented in a fixed width font and between "".

Compilation units

entity ::=
object |
category |
protocol

Object definition

object ::=
begin_object_directive [object_directives] [clauses] end_object_directive.
begin_object_directive ::=
":- object(" object_identifier [ "," object_relations] ")."
end_object_directive ::=
":- end_object."
object_relations ::=
prototype_relations |
non_prototype_relations
prototype_relations ::=
prototype_relation |
prototype_relation "," prototype_relations
prototype_relation ::=
implements_protocols |
imports_categories |
extends_objects
non_prototype_relations ::=
non_prototype_relation |
non_prototype_relation "," non_prototype_relations
non_prototype_relation ::=
implements_protocols |
imports_categories |
instantiates_classes |
specializes_classes

Category definition

category ::=
begin_category_directive [category_directives] [clauses] end_category_directive.
begin_category_directive ::=
":- category(" category_identifier [ "," implements_protocols] ")."
end_category_directive ::=
":- end_category."

Protocol definition

protocol ::=
begin_protocol_directive [protocol_directives] end_protocol_directive.
begin_protocol_directive ::=
":- protocol(" protocol_identifier [ "," extends_protocols] ")."
end_protocol_directive ::=
":- end_protocol."

Entity relations

implements_protocols ::=
"implements(" implemented_protocols ")"
extends_protocols ::=
"extends(" extended_protocols ")"
imports_categories ::=
"imports(" imported_categories ")"
extends_objects ::=
"extends(" extended_objects ")"
instantiates_classes ::=
"instantiates(" instantiated_objects ")"
specializes_classes ::=
"specializes(" specialized_objects ")"

Implemented protocols

implemented_protocols ::=
implemented_protocol |
implemented_protocol_sequence |
implemented_protocol_list
implemented_protocol ::=
protocol_identifier |
scope "::" protocol_identifier
implemented_protocol_sequence ::=
implemented_protocol |
implemented_protocol "," implemented_protocol_sequence
implemented_protocol_list ::=
"[" implemented_protocol_sequence "]"

Extended protocols

extended_protocols ::=
extended_protocol |
extended_protocol_sequence |
extended_protocol_list
extended_protocol ::=
protocol_identifier |
scope "::" protocol_identifier
extended_protocol_sequence ::=
extended_protocol |
extended_protocol "," extended_protocol_sequence
extended_protocol_list ::=
"[" extended_protocol_sequence "]"

Imported categories

imported_categories ::=
imported_category |
imported_category_sequence |
imported_category_list
imported_category ::=
category_identifier |
scope "::" category_identifier
imported_category_sequence ::=
imported_category |
imported_category "," imported_category_sequence
imported_category_list ::=
"[" imported_category_sequence "]"

Extended objects

extended_objects ::=
extended_object |
extended_object_sequence |
extended_object_list
extended_object ::=
object_identifier |
scope "::" object_identifier
extended_object_sequence ::=
extended_object |
extended_object "," extended_object_sequence
extended_object_list ::=
"[" extended_object_sequence "]"

Instantiated objects

instantiated_objects ::=
instantiated_object |
instantiated_object_sequence |
instantiated_object_list
instantiated_object ::=
object_identifier |
scope "::" object_identifier
instantiated_object_sequence ::=
instantiated_object
instantiated_object "," instantiated_object_sequence |
instantiated_object_list ::=
"[" instantiated_object_sequence "]"

Specialized objects

specialized_objects ::=
specialized_object |
specialized_object_sequence |
specialized_object_list
specialized_object ::=
object_identifier |
scope "::" object_identifier
specialized_object_sequence ::=
specialized_object |
specialized_object "," specialized_object_sequence
specialized_object_list ::=
"[" specialized_object_sequence "]"

Entity scope

scope ::=
"public" |
"protected" |
"private"

Entity identifiers

entity_identifiers ::=
entity_identifier |
entity_identifier_sequence |
entity_identifier_list
entity_identifier ::=
object_identifier |
protocol_identifier |
category_identifier
entity_identifier_sequence ::=
entity_identifier |
entity_identifier "," entity_identifier_sequence
entity_identifier_list ::=
"[" entity_identifier_sequence "]"

Object identifiers

object_identifiers ::=
object_identifier |
object_identifier_sequence |
object_identifier_list
object_identifier ::=
atom |
compound
object_identifier_sequence ::=
object_identifier |
object_identifier "," object_identifier_sequence
object_identifier_list ::=
"[" object_identifier_sequence "]"

Category identifiers

category_identifiers ::=
category_identifier |
category_identifier_sequence |
category_identifier_list
category_identifier ::=
atom
category_identifier_sequence ::=
category_identifier |
category_identifier "," category_identifier_sequence
category_identifier_list ::=
"[" category_identifier_sequence "]"

Protocol identifiers

protocol_identifiers ::=
protocol_identifier |
protocol_identifier_sequence |
protocol_identifier_list
protocol_identifier ::=
atom
protocol_identifier_sequence ::=
protocol_identifier |
protocol_identifier "," protocol_identifier_sequence
protocol_identifier_list ::=
"[" protocol_identifier_sequence "]"

Directives

Object directives

object_directives ::=
object_directive |
object_directive object_directives
object_directive ::=
":- initialization(" callable ")." |
":- uses(" object_identifiers ")." |
":- calls(" protocol_identifiers ")." |
":- dynamic." |
":- info(" info_list ")." |
predicate_directives

Category directives

category_directives ::=
category_directive |
category_directive category_directives
category_directive ::=
":- initialization(" callable ")." |
":- uses(" object_identifiers ")." |
":- calls(" protocol_identifiers ")." |
":- dynamic." |
":- info(" info_list ")." |
predicate_directives

Protocol directives

protocol_directives ::=
protocol_directive |
protocol_directive protocol_directives
protocol_directive ::=
":- initialization(" callable ")." |
":- dynamic." |
":- info(" info_list ")." |
predicate_directives

Predicate directives

predicate_directives ::=
predicate_directive |
predicate_directive predicate_directives
predicate_directive ::=
scope_directive |
mode_directive |
metapredicate_directive |
info_directive |
operator_directive |
dynamic_directive |
discontiguous_directive
scope_directive ::=
":- public(" predicate_indicator_term ")." |
":- protected(" predicate_indicator_term ")." |
":- private(" predicate_indicator_term ")."
mode_directive ::=
":- mode(" predicate_mode_term "," number_of_solutions ")."
metapredicate_directive ::=
":- metapredicate(" metapredicate_mode_indicator ")."
info_directive ::=
":- info(" predicate_indicator "," info_list ")."
predicate_indicator_term ::=
predicate_indicator |
predicate_indicator_sequence |
predicate_indicator_list
predicate_indicator_sequence ::=
predicate_indicator |
predicate_indicator "," predicate_indicator_sequence
predicate_indicator_list ::=
"[" predicate_indicator_sequence "]"
predicate_mode_term ::=
atom "(" mode_terms ")"
mode_terms ::=
mode_term |
mode_term "," mode_terms
mode_term ::=
"@" [type] | "+" [type] | "-" [type] | "?" [type]
metapredicate_mode_indicator ::=
atom "(" metapredicate_terms ")"
metapredicate_terms ::=
metapredicate_term |
metapredicate_term "," metapredicate_terms
metapredicate_term ::=
"::" | "*"
type ::=
prolog_type | logtalk_type | user_defined_type
prolog_type ::=
"term" | "nonvar" | "var" |
"compound" | "ground" | "callable" | "list" |
"atomic" | "atom" |
"number" | "integer" | "float"
logtalk_type ::=
"object" | "category" | "protocol" |
"event"
user_defined_type ::=
atom |
compound
number_of_solutions ::=
"zero" | "zero_or_one" | "zero_or_more" | "one" | "one_or_more" | "error"
info_list ::=
"[]" |
"[" info_item "is" nonvar "|" info_list "]"
info_item ::=
"comment" | "author" | "version" | "date" |
"parnames" | "argnames" |
"definition" | "redefinition" | "allocation" |
"exceptions" |
atom

Clauses and goals

goal ::=
callable |
message_call |
external_call |
message_call ::=
message_to_object |
message_to_self |
message_to_super
message_to_object ::=
receivers "::" messages
message_to_self ::=
"::" messages
message_to_super ::=
"^^" message
messages ::=
message |
"(" message "," messages ")" |
"(" message ";" messages ")"
message ::=
callable |
variable
receivers ::=
receiver |
"(" receiver "," receivers ")" |
"(" receiver ";" receivers ")"
receiver ::=
object_identifier |
variable
external_call ::=
"{" callable "}"

Entity properties

category_property ::=
"static" |
"dynamic" |
"built_in"
object_property ::=
"static" |
"dynamic" |
"built_in"
protocol_property ::=
"static" |
"dynamic" |
"built_in"

Predicate properties

predicate_property ::=
"static" |
"dynamic" |
"private" |
"protected" |
"public" |
"built_in" |
"declared_in(" entity_identifier ")" |
"defined_in(" object_identifier | category_identifier ")" |
"metapredicate(" metapredicate_mode_indicator ")"