%start Model ;
%left <close>;
%glr;
<whitespace> : \s+ ;
<eol> : \r | \n | \r\n ;
<letter> : [a-zA-Z_] ;
<digit> : [0-9] ;
<integer> : \-? <digit>+ ;
<number> : \-? <digit>+ ( \. <digit>+ ) ? ( [eE] ( \- | \+ ) ? <digit>+ ) ? ;
<string> : \' [^\']* \' (\' [^\']* \')* ;
<boolean> : true | false ;
<open> : \( ;
<close> : \) ;
<simpleName> : <letter> ( <letter> | <digit> ) * ;
<qualifiedName> : <letter> ( <letter> | <digit> ) * ( \. <letter> ( <letter> | <digit> ) * ) * ;
Model : <open> ElementNodes <close> ;
ElementNodes : ElementNode | ElementNode ElementNodes ;
ElementNode : <open> Name Identifier AttributeNodes <close> ;
Identifier : <open> IdentifierToken Integer <close> ;
IdentifierToken : "id:" 'refToken';
AttributeNodes : | AttributeNode AttributeNodes ;
AttributeNode : <open> SimpleName ValueNodes <close> ;
ValueNodes : ValueNode | ValueNode ValueNodes ;
ValueNode : Primitive | Reference ;
Primitive : String | Integer | Number | Boolean ;
Reference : IntegerReference | NameReference ;
IntegerReference : <open> ReferenceToken Integer <close>;
NameReference : <open> ReferenceToken QualifiedName <close>;
ReferenceToken : "ref:" 'refToken';
Integer : <integer> 'integer';
Number : <number> 'number' ;
String: <string> 'string';
Boolean: <boolean> 'boolean';
Name : SimpleName | QualifiedName ;
SimpleName : <simpleName> 'simpleName';
QualifiedName : <qualifiedName> 'qualifiedName';