Logtalk Grammar

contents > reference manual

## 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`" |
> >   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 "`)`"

previous | glossary | next
Copyright © Paulo Moura — Logtalk.org