LogtalkDotOrg / logtalk3

Logtalk - declarative object-oriented logic programming language
https://logtalk.org
Apache License 2.0
425 stars 31 forks source link

Grammar railroad diagram #189

Closed mingodad closed 1 year ago

mingodad commented 1 year ago

If you change the EBNF used to describe the grammar by the one understood by https://www.bottlecaps.de/rr/ui (see bellow) you can get a nice navigable railroad diagram for it.

Noticed that the EBNF shown bellow came from a copy/paste/format/cleanup from https://logtalk.org/manuals/refman/grammar.html and there was several dubious rules that I used my judgement to fix then.

//
// EBNF to be viewd at https://www.bottlecaps.de/rr/ui
//
// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab
// then click the 'View Diagram' tab.
//

//Grammar
//The Logtalk grammar is here described using Backus-Naur Form syntax. Non-terminal symbols in italics have the definition found in the ISO Prolog Core standard. Terminal symbols are represented in a fixed width font and between double-quotes.

//Entities
entity ::=
    object
    |category
    |protocol

//Object definition
object ::=
    begin_object_directive object_terms? 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_terms? end_category_directive

begin_category_directive ::=
    ":- category(" category_identifier ( "," category_relations )? ")."

end_category_directive ::=
    ":- end_category."

category_relations ::=
    category_relation
    |category_relation "," category_relations

category_relation ::=
    implements_protocols
    |extends_categories
    |complements_objects

//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
extends_protocols ::=
    "extends(" extended_protocols ")"

extends_objects ::=
    "extends(" extended_objects ")"

extends_categories ::=
    "extends(" extended_categories ")"

implements_protocols ::=
    "implements(" implemented_protocols ")"

imports_categories ::=
    "imports(" imported_categories ")"

instantiates_classes ::=
    "instantiates(" instantiated_objects ")"

specializes_classes ::=
    "specializes(" specialized_objects ")"

complements_objects ::=
    "complements(" complemented_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 "]"

//Extended categories
extended_categories ::=
    extended_category
    |extended_category_sequence
    |extended_category_list

extended_category ::=
    category_identifier
    |scope "::" category_identifier

extended_category_sequence ::=
    extended_category
    |extended_category "," extended_category_sequence

extended_category_list ::=
    "[" extended_category_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 "]"

//Complemented objects
complemented_objects ::=
    object_identifier
    |complemented_object_sequence
    |complemented_object_list

complemented_object_sequence ::=
    object_identifier
    |object_identifier "," complemented_object_sequence

complemented_object_list ::=
    "[" complemented_object_sequence "]"

//Entity and predicate 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
    |compound

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 "]"

//Module identifiers
module_identifier ::=
    atom

//Source file names
source_file_names ::=
    source_file_name
    |source_file_name_list

source_file_name ::=
    atom
    |library_source_file_name

library_source_file_name ::=
    library_name "(" atom ")"

library_name ::=
    atom

source_file_name_sequence ::=
    source_file_name
    |source_file_name "," source_file_name_sequence

source_file_name_list ::=
    "[" source_file_name_sequence "]"

//Terms
//Object terms
object_terms ::=
    object_term
    |object_term object_terms

object_term ::=
    object_directive
    |clause
    |grammar_rule

//Category terms
category_terms ::=
    category_term
    |category_term category_terms

category_term ::=
    category_directive
    |clause
    |grammar_rule

//Directives
//Source file directives
source_file_directives ::=
    source_file_directive
    |source_file_directive source_file_directives

source_file_directive ::=
    ":- encoding(" atom ")."
    |":- set_logtalk_flag(" atom "," nonvar ")."
    |":- include(" source_file_name ")."

//Prolog directives
//Conditional compilation directives
conditional_compilation_directives ::=
    conditional_compilation_directive
    |conditional_compilation_directive conditional_compilation_directives

conditional_compilation_directive ::=
    ":- if(" callable ")."
    |":- elif(" callable ")."
    |":- else."
    |":- endif."

//Object directives
object_directives ::=
    object_directive
    |object_directive object_directives

object_directive ::=
    ":- initialization(" callable ")."
    |":- built_in."
    |":- threaded."
    |":- dynamic."
    |":- info(" entity_info_list ")."
    |":- set_logtalk_flag(" atom "," nonvar ")."
    |":- include(" source_file_name ")."
    |":- uses(" object_alias_list ")."
    |predicate_directives

//Category directives
category_directives ::=
    category_directive
    |category_directive category_directives

category_directive ::=
    ":- built_in."
    |":- dynamic."
    |":- info(" entity_info_list ")."
    |":- set_logtalk_flag(" atom "," nonvar ")."
    |":- include(" source_file_name ")."
    |":- uses(" object_alias_list ")."
    |predicate_directives

//Protocol directives
protocol_directives ::=
    protocol_directive
    |protocol_directive protocol_directives

protocol_directive ::=
    ":- built_in."
    |":- dynamic."
    |":- info(" entity_info_list ")."
    |":- set_logtalk_flag(" atom "," nonvar ")."
    |":- include(" source_file_name ")."
    |predicate_directives

//Predicate directives
predicate_directives ::=
    predicate_directive
    |predicate_directive predicate_directives

predicate_directive ::=
    alias_directive
    |synchronized_directive
    |uses_directive
    |use_module_directive
    |scope_directive
    |mode_directive
    |meta_predicate_directive
    |meta_non_terminal_directive
    |info_directive
    |dynamic_directive
    |discontiguous_directive
    |multifile_directive
    |coinductive_directive
    |operator_directive

alias_directive ::=
    ":- alias(" entity_identifier "," predicate_indicator_alias_list 
    | non_terminal_indicator_alias_list ")."

synchronized_directive ::=
    ":- synchronized(" predicate_indicator_term 
    | non_terminal_indicator_term ")."

uses_directive ::=
    ":- uses(" object_identifier 
    | parameter_variable "," predicate_indicator_alias_list 
    | non_terminal_indicator_alias_list 
    | operator_list ")."

use_module_directive ::=
    ":- use_module(" module_identifier 
    | parameter_variable "," module_predicate_indicator_alias_list 
    | module_non_terminal_indicator_alias_list 
    | operator_list ")."

scope_directive ::=
    ":- public(" predicate_indicator_term 
    | non_terminal_indicator_term ")."
    |":- protected(" predicate_indicator_term 
    | non_terminal_indicator_term ")."
    |":- private(" predicate_indicator_term 
    | non_terminal_indicator_term ")."

mode_directive ::=
    ":- mode(" predicate_mode_term 
    | non_terminal_mode_term "," number_of_proofs ")."

meta_predicate_directive ::=
    ":- meta_predicate(" meta_predicate_template_term ")."

meta_non_terminal_directive ::=
    ":- meta_non_terminal(" meta_non_terminal_template_term ")."

info_directive ::=
    ":- info(" predicate_indicator 
    | non_terminal_indicator "," predicate_info_list ")."

dynamic_directive ::=
    ":- dynamic(" qualified_predicate_indicator_term 
    | qualified_non_terminal_indicator_term ")."

discontiguous_directive ::=
    ":- discontiguous(" predicate_indicator_term
    |non_terminal_indicator_term ")."

multifile_directive ::=
    ":- multifile(" qualified_predicate_indicator_term
    |qualified_non_terminal_indicator_term ")."

coinductive_directive ::=
    ":- coinductive(" predicate_indicator_term
    |coinductive_predicate_template_term ")."

parameter_variable ::=
    _variable_

entity_resources_list ::=
    predicate_indicator_list
    |operator_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 "]"

qualified_predicate_indicator_term ::=
    qualified_predicate_indicator
    |qualified_predicate_indicator_sequence
    |qualified_predicate_indicator_list

qualified_predicate_indicator_sequence ::=
    qualified_predicate_indicator
    |qualified_predicate_indicator "," qualified_predicate_indicator_sequence

qualified_predicate_indicator_list ::=
    "[" qualified_predicate_indicator_sequence "]"

qualified_predicate_indicator ::=
    predicate_indicator
    |object_identifier "::" predicate_indicator
    |category_identifier "::" predicate_indicator
    |module_identifier ":" predicate_indicator

predicate_indicator_alias ::=
    predicate_indicator
    |predicate_indicator "as" predicate_indicator
    |predicate_indicator "::" predicate_indicator

predicate_indicator_alias_sequence ::=
    predicate_indicator_alias
    |predicate_indicator_alias "," predicate_indicator_alias_sequence

predicate_indicator_alias_list ::=
    "[" predicate_indicator_alias_sequence "]"

predicate_template_alias ::=
    callable "as" callable
    |callable "::" callable

predicate_template_alias_sequence ::=
    predicate_template_alias
    |predicate_template_alias "," predicate_template_alias_sequence

predicate_template_alias_list ::=
    "[" predicate_template_alias_sequence "]"

module_predicate_indicator_alias ::=
    predicate_indicator
    |predicate_indicator "as" predicate_indicator
    |predicate_indicator ":" predicate_indicator

module_predicate_indicator_alias_sequence ::=
    module_predicate_indicator_alias
    |module_predicate_indicator_alias "," module_predicate_indicator_alias_sequence

module_predicate_indicator_alias_list ::=
    "[" module_predicate_indicator_alias_sequence "]"

module_non_terminal_indicator_alias ::=
    non_terminal_indicator
    |non_terminal_indicator "as" non_terminal_indicator 
    | non_terminal_indicator ":" non_terminal_indicator

module_non_terminal_indicator_alias_sequence ::=
    module_non_terminal_indicator_alias
    |module_non_terminal_indicator_alias "," module_non_terminal_indicator_alias_sequence

module_non_terminal_indicator_alias_list ::=
    "[" module_non_terminal_indicator_alias_sequence "]"

non_terminal_indicator_term ::=
    non_terminal_indicator
    |non_terminal_indicator_sequence
    |non_terminal_indicator_list

non_terminal_indicator_sequence ::=
    non_terminal_indicator
    |non_terminal_indicator "," non_terminal_indicator_sequence

non_terminal_indicator_list ::=
    "[" non_terminal_indicator_sequence "]"

non_terminal_indicator ::=
    functor "//" arity

qualified_non_terminal_indicator_term ::=
    qualified_non_terminal_indicator
    |qualified_non_terminal_indicator_sequence
    |qualified_non_terminal_indicator_list

qualified_non_terminal_indicator_sequence ::=
    qualified_non_terminal_indicator
    |qualified_non_terminal_indicator ", " qualified_non_terminal_indicator_sequence

qualified_non_terminal_indicator_list ::=
    "[" qualified_non_terminal_indicator_sequence "]"

qualified_non_terminal_indicator ::=
    non_terminal_indicator
    |object_identifier "::" non_terminal_indicator
    |category_identifier "::" non_terminal_indicator
    |module_identifier ":" non_terminal_indicator

non_terminal_indicator_alias ::=
    non_terminal_indicator
    |non_terminal_indicator "as" non_terminal_indicator
    | non_terminal_indicator "::" non_terminal_indicator

non_terminal_indicator_alias_sequence ::=
    non_terminal_indicator_alias
    |non_terminal_indicator_alias "," non_terminal_indicator_alias_sequence

non_terminal_indicator_alias_list ::=
    "[" non_terminal_indicator_alias_sequence "]"

operator_sequence ::=
    operator specification
    |operator specification "," operator_sequence

operator_list ::=
    "[" operator_sequence "]"

coinductive_predicate_template_term ::=
    coinductive_predicate_template
    |coinductive_predicate_template_sequence
    |coinductive_predicate_template_list

coinductive_predicate_template_sequence ::=
    coinductive_predicate_template
    |coinductive_predicate_template "," coinductive_predicate_template_sequence

coinductive_predicate_template_list ::=
    "[" coinductive_predicate_template_sequence "]"

coinductive_predicate_template ::=
    atom "(" coinductive_mode_terms ")"

coinductive_mode_terms ::=
    coinductive_mode_term
    |coinductive_mode_terms "," coinductive_mode_terms

coinductive_mode_term ::=
    "+" 
    | "-"

predicate_mode_term ::=
    atom "(" mode_terms ")"

non_terminal_mode_term ::=
    atom "(" mode_terms ")"

mode_terms ::=
    mode_term
    |mode_term "," mode_terms

mode_term ::=
    "@"  type? 
    | "+" type? 
    | "-" type? 
    | "?" type?
    |"++" type? 
    | "--" type?

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_proofs ::=
    "zero" 
    | "zero_or_one" 
    | "zero_or_more" 
    | "one"
    |"one_or_more" 
    | "zero_or_error" 
    | "one_or_error"
    |"zero_or_one_or_error" 
    | "error"

meta_predicate_template_term ::=
    meta_predicate_template
    |meta_predicate_template_sequence
    |meta_predicate_template_list

meta_predicate_template_sequence ::=
    meta_predicate_template
    |meta_predicate_template "," meta_predicate_template_sequence

meta_predicate_template_list ::=
    "[" meta_predicate_template_sequence "]"

meta_predicate_template ::=
    object_identifier "::" atom "(" meta_predicate_specifiers ")"
    |category_identifier "::" atom "(" meta_predicate_specifiers ")"
    |atom "(" meta_predicate_specifiers ")"

meta_predicate_specifiers ::=
    meta_predicate_specifier
    |meta_predicate_specifier "," meta_predicate_specifiers

meta_predicate_specifier ::=
    non-negative integer 
    | "::" 
    | "^"
    |"*"

meta_non_terminal_template_term ::=
    meta_predicate_template_term

entity_info_list ::=
    "[]"
    |"[" entity_info_item "is" nonvar "|" entity_info_list "]"

entity_info_item ::=
    "comment" 
    | "remarks"
    |"author" 
    | "version" 
    | "date"
    |"copyright" 
    | "license"
    |"parameters" 
    | "parnames"
    |"see_also"
    |atom

predicate_info_list ::=
    "[]"
    |"[" predicate_info_item "is" nonvar "|" predicate_info_list "]"

predicate_info_item ::=
    "comment" 
    | "remarks"
    |"arguments" 
    | "argnames"
    |"redefinition" 
    | "allocation"
    |"examples" 
    | "exceptions"
    |atom

object_alias ::=
    object_identifier "as" object_identifier

object_alias_sequence ::=
    object_alias
    |object_alias "," object_alias_sequence

object_alias_list ::=
    "[" object_alias_sequence "]"

//Clauses and goals
clause ::=
    object_identifier "::" head ":-" body
    |module_identifier ":" head ":-" body
    |head ":-" body
    |fact

goal ::=
    message_sending
    |super_call
    |external_call
    |context_switching_call
    |callable

message_sending ::=
    message_to_object
    |message_delegation
    |message_to_self

message_to_object ::=
    receiver "::" messages

message_delegation ::=
    "[" message_to_object "]"

message_to_self ::=
    "::" messages

super_call ::=
    "^^" message

messages ::=
    message
    |"(" message "," messages ")"
    |"(" message ";" messages ")"
    |"(" message "->" messages ")"

message ::=
    callable
    |variable

receiver ::=
    "{" callable "}"
    |object_identifier
    |variable

external_call ::=
    "{" callable "}"

context_switching_call ::=
    object_identifier "<<" goal

//Lambda expressions
lambda_expression ::=
    lambda_free_variables "/" lambda_parameters ">>" callable
    |lambda_free_variables "/" callable
    |lambda_parameters ">>" callable

lambda_free_variables ::=
    "{" conjunction of variables "}"
    |"{" variable "}"
    |"{}"

lambda_parameters ::=
    list of terms
    |"[]"

//Entity properties
category_property ::=
    "static"
    |"dynamic"
    |"built_in"
    |"file(" atom ")"
    |"file(" atom "," atom ")"
    |"lines(" integer "," integer ")"
    |"events"
    |"source_data"
    |"public(" entity_resources_list ")"
    |"protected(" entity_resources_list ")"
    |"private(" entity_resources_list ")"
    |"declares(" predicate_indicator "," predicate_declaration_property_list ")"
    |"defines(" predicate_indicator "," predicate_definition_property_list ")"
    |"includes(" (predicate_indicator "," object_identifier | category_identifier "," predicate_definition_property_list ) ")"
    |"provides(" ( predicate_indicator "," object_identifier | category_identifier "," predicate_definition_property_list ) ")"
    |"alias(" predicate_indicator "," predicate_alias_property_list ")"
    |"calls(" predicate "," predicate_call_update_property_list ")"
    |"updates(" predicate "," predicate_call_update_property_list ")"
    |"number_of_clauses(" integer ")"
    |"number_of_rules(" integer ")"
    |"number_of_user_clauses(" integer ")"
    |"number_of_user_rules(" integer ")"
    |"debugging"

object_property ::=
    "static"
    |"dynamic"
    |"built_in"
    |"threaded"
    |"file(" atom ")"
    |"file(" atom "," atom ")"
    |"lines(" integer "," integer ")"
    |"context_switching_calls"
    |"dynamic_declarations"
    |"events"
    |"source_data"
    |"complements(" ("allow" | "restrict") ")"
    |"complements"
    |"public(" entity_resources_list ")"
    |"protected(" entity_resources_list ")"
    |"private(" entity_resources_list ")"
    |"declares(" predicate_indicator "," predicate_declaration_property_list ")"
    |"defines(" predicate_indicator "," predicate_definition_property_list ")"
    |"includes(" ( predicate_indicator "," object_identifier | category_identifier "," predicate_definition_property_list ) ")"
    |"provides(" ( predicate_indicator "," object_identifier | category_identifier "," predicate_definition_property_list ) ")"
    | "alias(" predicate_indicator "," predicate_alias_property_list ")"
    |"calls(" predicate "," predicate_call_update_property_list ")"
    |"updates(" predicate "," predicate_call_update_property_list ")"
    |"number_of_clauses(" integer ")"
    |"number_of_rules(" integer ")"
    |"number_of_user_clauses(" integer ")"
    | "number_of_user_rules(" integer ")"
    |"module"
    | "debugging"

protocol_property ::=
    "static"
    |"dynamic"
    |"built_in"
    |"source_data"
    |"file(" atom ")"
    |"file(" atom "," atom ")"
    |"lines(" integer "," integer ")"
    |"public(" entity_resources_list ")"
    |"protected(" entity_resources_list ")"
    |"private(" entity_resources_list ")"
    |"declares(" predicate_indicator "," predicate_declaration_property_list ")"
    |"alias(" predicate_indicator "," predicate_alias_property_list ")"
    |"debugging"

predicate_declaration_property_list ::=
    "[" predicate_declaration_property_sequence "]"

predicate_declaration_property_sequence ::=
    predicate_declaration_property
    |predicate_declaration_property "," predicate_declaration_property_sequence

predicate_declaration_property ::=
    "static" 
    | "dynamic"
    |"scope(" scope ")"
    |"private" 
    | "protected" 
    | "public"
    |"coinductive"
    |"multifile"
    |"synchronized"
    |"meta_predicate(" meta_predicate_template ")"
    |"coinductive(" coinductive_predicate_template ")"
    |"non_terminal(" non_terminal_indicator ")"
    |"include(" atom ")"
    |"line_count(" integer ")"
    |"mode(" (predicate_mode_term | non_terminal_mode_term "," number_of_proofs) ")"
    |"info(" list ")"

predicate_definition_property_list ::=
    "[" predicate_definition_property_sequence "]"

predicate_definition_property_sequence ::=
    predicate_definition_property
    |predicate_definition_property "," predicate_definition_property_sequence

predicate_definition_property ::=
    "inline" 
    | "auxiliary"
    |"non_terminal(" non_terminal_indicator ")"
    |"include(" atom ")"
    |"line_count(" integer ")"
    |"number_of_clauses(" integer ")"
    |"number_of_rules(" integer ")"

predicate_alias_property_list ::=
    "[" predicate_alias_property_sequence "]"

predicate_alias_property_sequence ::=
    predicate_alias_property
    |predicate_alias_property "," predicate_alias_property_sequence

predicate_alias_property ::=
    "for(" predicate_indicator ")"
    |"from(" entity_identifier ")"
    |"non_terminal(" non_terminal_indicator ")"
    |"include(" atom ")"
    |"line_count(" integer ")"

predicate ::=
    predicate_indicator
    |"^^" predicate_indicator
    |"::" predicate_indicator
    |variable "::" predicate_indicator
    |object_identifier "::" predicate_indicator
    |variable ":" predicate_indicator
    |module_identifier ":" predicate_indicator

predicate_call_update_property_list ::=
    "[" predicate_call_update_property_sequence "]"

predicate_call_update_property_sequence ::=
    predicate_call_update_property
    |predicate_call_update_property "," predicate_call_update_property_sequence

predicate_call_update_property ::=
    "caller(" predicate_indicator ")"
    |"include(" atom ")"
    |"line_count(" integer ")"
    |"as(" predicate_indicator ")"

//Predicate properties
predicate_property ::=
    "static" 
    | "dynamic"
    |"scope(" scope ")"
    |"private" 
    | "protected" 
    | "public"
    |"logtalk" 
    | "prolog" 
    | "foreign"
    |"coinductive(" coinductive_predicate_template ")"
    |"multifile"
    |"synchronized"
    |"built_in"
    |"inline"
    |"declared_in(" entity_identifier ")"
    |"defined_in(" (object_identifier | category_identifier) ")"
    |"redefined_from(" (object_identifier | category_identifier) ")"
    |"meta_predicate(" meta_predicate_template ")"
    |"alias_of(" callable ")"
    |"alias_declared_in(" entity_identifier ")"
    |"non_terminal(" non_terminal_indicator ")"
    |"mode(" (predicate_mode_term | non_terminal_mode_term "," number_of_proofs) ")"
    |"info(" list ")"
    |"number_of_clauses(" integer ")"
    |"number_of_rules(" integer ")"
    |"declared_in(" entity_identifier "," line_count ")"
    |"defined_in(" (object_identifier | category_identifier "," line_count) ")"
    |"redefined_from(" (object_identifier | category_identifier "," line_count) ")"
    |"alias_declared_in(" entity_identifier "," line_count ")"

line_count ::=
    integer

//Compiler flags
compiler_flag ::=
    flag "(" flag_value ")"
pmoura commented 1 year ago

The diagrams look really nice and useful! Thanks for your contribution! I will adapt it (with due credit). You also wrote:

Noticed that the EBNF shown bellow came from a copy/paste/format/cleanup from https://logtalk.org/manuals/refman/grammar.html and there was several dubious rules that I used my judgement to fix then.

Do you remember which rules you found dubious?

mingodad commented 1 year ago

There is some . dots at the end of some rules :

object ::=
      begin_object_directive [ object_terms ] end_object_directive.
...
category ::=
    begin_category_directive [ category_terms ] end_category_directive.

And some | alternations on the middle of what seems to be one rule:

...
alias_directive ::=
“:- alias(”
entity_identifier “,”
predicate_indicator_alias_list | non_terminal_indicator_alias_list
“).”
...
uses_directive ::=
“:- uses(”
object_identifier | parameter_variable “,”
predicate_indicator_alias_list | non_terminal_indicator_alias_list | operator_list
“).”
...
“provides(” predicate_indicator “,” object_identifier | category_identifier “,” predicate_definition_property_list “)”
...

And maybe straw quotes ?:

line_count ::=
integer”

And some missing quotes ?:

compiler_flag ::=
flag(flag_value)
pmoura commented 1 year ago

Thanks. In the case of the alias/2, uses/2 directives (and a few others) there are parenthesis missing. I'm fixing those and the typos.

pmoura commented 1 year ago

Pushed a first commit with the changes:

https://github.com/LogtalkDotOrg/logtalk3/commit/06acfe54733a5b752ee0db8364255cd6d82ca2af

I still need to find how best to provide the generated diagram. Several Handbook sections link to different parts of grammar and thus the diagram cannot be included as-is.

mingodad commented 1 year ago

I'm trying to adapt your grammar to use here https://mingodad.github.io/parsertl-playground/playground/ but there is this rules that are not referenced anywhere:

'category_directives' is an unused rule.
'category_identifiers' is an unused rule.
'category_property' is an unused rule.
'compiler_flag' is an unused rule.
'entity_identifiers' is an unused rule.
'goal' is an unused rule.
'lambda_expression' is an unused rule.
'non_terminal_indicator_term' is an unused rule.
'object_directives' is an unused rule.
'object_identifiers' is an unused rule.
'object_property' is an unused rule.
'predicate_indicator_alias_list' is an unused rule.
'predicate_property' is an unused rule.
'predicate_template_alias_list' is an unused rule.
'protocol_identifiers' is an unused rule.
'protocol_property' is an unused rule.
'source_file_directives' is an unused rule.
'source_file_names' is an unused rule.

There is something missing ?

pmoura commented 1 year ago

Just pushed 0f19b1c711c383f41dd7781a1d7149763a947799 simplifying and removing several rules. You will still find some reported as unused as they are referenced from other Handbook sections.

mingodad commented 1 year ago

Thank you ! But I'll give up for now because it doesn't describe a valid grammar as it is now.

pmoura commented 1 year ago

I assume that a main issue is that Prolog non-terminals (e.g. callable or integer) are implicit defined?

pmoura commented 1 year ago

Diagram published at:

https://logtalk.org/_pages/grammar_diagram.html