{
  parserClass="org.jastadd.tooling.grammar.parser.GrammarParser"

  extends="com.intellij.extapi.psi.ASTWrapperPsiElement"

  psiClassPrefix="Grammar"
  psiImplClassSuffix="Impl"
  psiPackage="org.jastadd.tooling.grammar.psi"
  psiImplPackage="org.jastadd.tooling.grammar.psi.impl"

  elementTypeHolderClass="org.jastadd.tooling.grammar.parser.GrammarTypes"
  elementTypeClass="org.jastadd.tooling.grammar.psi.GrammarElementType"
  tokenTypeClass="org.jastadd.tooling.grammar.psi.GrammarTokenType"

  psiImplUtilClass="org.jastadd.tooling.grammar.psi.impl.GrammarPsiImplUtil"
}

GrammarFile ::= comment* ((type_decl | relation) comment*)*

comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)

type_decl ::= ABSTRACT? type_name (COL type_name)? (ASSIGN (component | nta_component)*)? SCOL
{
  extends="org.jastadd.tooling.grammar.psi.impl.GrammarTypeDeclImplExtension"
  implements="org.jastadd.tooling.common.psi.NamedElement"
}

nta_component ::= SLASH component SLASH

component ::= (component_name COL type_name STAR?) | (type_name STAR?) | (LBRACKET component_name COL type_name RBRACKET) | (LBRACKET type_name RBRACKET) | (LT component_name (COL (java_type_use))? GT)

java_type_use ::=  parameterized_java_type_use | simple_java_type_use

parameterized_java_type_use ::= simple_java_type_use LT java_type_use (COMMA java_type_use)* GT

simple_java_type_use ::=  java_name (DOT java_name)*

relation ::=  REL ((unnamed_role LEFT navigable_role) | (navigable_role RIGHT unnamed_role) | (navigable_role BIDIRECTIONAL navigable_role)) SCOL

unnamed_role ::= type_name | navigable_role

navigable_role ::= type_name DOT component_name (STAR | QUESTION_MARK)?

//// for auto-completion, it is helpful if we can distinguish the different IDs
//type_name ::= ID

type_name ::= ID
{
  extends="org.jastadd.tooling.grammar.psi.impl.GrammarTypeNameImplExtension"
  implements="org.jastadd.tooling.common.psi.NamedElement"
}

component_name ::= ID
{
  extends="org.jastadd.tooling.grammar.psi.impl.GrammarComponentNameImplExtension"
  implements="org.jastadd.tooling.common.psi.NamedElement"
}


java_name ::= ID