/*
 * Copyright (c) 2011 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Author: alruiz@google.com (Alex Ruiz)
 */
grammar com.google.eclipse.protobuf.Protobuf hidden(WS, ML_COMMENT, SL_COMMENT)

import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate protobuf "http://www.google.com/eclipse/protobuf/Protobuf"

Protobuf:
  (syntax=Syntax)?
  (elements+=ProtobufElement)*;

Syntax:
  'syntax' '=' name=STRING ';';

ProtobufElement:
  Package | Import | Option | ComplexType | MessageExtension | Service;

Package:
  'package' name=QualifiedName ';';

Import:
  NormalImport | PublicImport;

NormalImport:
  'import' importURI=STRING ';';

PublicImport:
  'import' 'public' importURI=STRING ';';

QualifiedName:
  '.'? Name ('.' Name)*;

ComplexType:
  Message | Enum | Group;

Message:
  'message' name=Name '{'
  elements+=MessageElement*
  '}' (';')?;

MessageElement:
  Option | Extensions | ComplexType | MessageField | MessageExtension;

Extensions:
  'extensions' ranges+=Range (',' ranges+=Range)* ';';

Range:
  from=LONG ('to' to=RangeMax)?;

RangeMax:
  LONG | 'max';

Group:
  modifier=Modifier 'group' name=Name '=' index=(LONG | HEX)
  ('[' (fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)*) ']')? '{'
  elements+=GroupElement*
  '}' (';')?;

GroupElement:
  Option | MessageField | Group | Enum | MessageExtension;

MessageField:
  modifier=Modifier type=TypeLink name=Name '=' index=(LONG | HEX)
  ('[' fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)* ']')? (';')+;

enum Modifier:
  required
  | optional
  | repeated;

TypeLink:
  ScalarTypeLink | ComplexTypeLink;

ScalarTypeLink:
  target=ScalarType;

enum ScalarType:
  double | float | int32 | int64 | uint32 | uint64 | sint32 | sint64 | fixed32 | fixed64 | sfixed32 | sfixed64 | bool |
  string | bytes;

ComplexTypeLink:
  target=[ComplexType|QualifiedName];

Enum:
  'enum' name=Name '{'
  elements+=EnumElement*
  '}' ';'?;

EnumElement:
  Option | Literal;

Literal:
  name=Name '=' index=(LONG | HEX) 
  ('[' fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)* ']')? ';';

terminal HEX returns ecore::ELong:
  ('-')? '0x' (NUMBER | 'a'..'f' | 'A'..'F')+;

MessageExtension:
  'extend' message=MessageLink '{'
  elements+=MessageElement*
  '}' (';')?;

Service:
  'service' name=Name '{'
  (elements+=ServiceElement)*
  '}' (';')?;

ServiceElement:
  Option | Rpc;

Rpc:
  'rpc' name=Name '(' argType=MessageLink ')' 'returns' '(' returnType=MessageLink ')'
  (('{' options+=Option* '}') (';')? | ';');

Name:
  ID | 'package' | 'import' | 'public' | 'option' | 'extend' | 'message' | 'optional' | 'required' | 'repeated' |
  'group' | 'enum' | 'service' | 'rpc' | 'returns' | 'true' | 'false' | 'default' | 'extensions' | 'to' | 'max' |
  'double' | 'float' | 'int32' | 'int64' | 'uint32' | 'uint64' | 'sint32' | 'sint64' | 'fixed32' | 'fixed64' |
  'sfixed32' | 'sfixed64' | 'bool' | 'string' | 'bytes';

MessageLink:
  target=[Message|QualifiedName];

Option:
  NativeOption | CustomOption;

NativeOption:
  'option' source=OptionSource '=' value=ValueLink ';';

CustomOption:
  'option' '(' source=OptionSource ')'
  ('.' optionFields+=OptionFieldSource ('.' optionFields+=OptionFieldSource)*)? '=' value=ValueLink ';';
 
FieldOption:
  DefaultValueFieldOption | NativeFieldOption | CustomFieldOption;

DefaultValueFieldOption:
  'default' '=' value=ValueLink;

NativeFieldOption:
  source=OptionSource '=' value=ValueLink;

CustomFieldOption:
  '(' source=OptionSource ')'
  ('.' optionFields+=OptionFieldSource ('.' optionFields+=OptionFieldSource)*)? '=' value=ValueLink;

OptionSource:
  optionField=[IndexedElement|QualifiedName];

OptionFieldSource:
  OptionMessageFieldSource | OptionExtendMessageFieldSource;

OptionMessageFieldSource:
  optionMessageField=[IndexedElement];  

OptionExtendMessageFieldSource:
  '(' optionExtendMessageField=[IndexedElement|QualifiedName] ')';  

IndexedElement:
  MessageField | Group;

ValueLink:
  MessageNotation | SimpleValueLink;

// { foo: 1, bar: 2 }
MessageNotation:
  '{'
  fields+=FieldNotation ((',')? fields+=FieldNotation)*
  '}';

FieldNotation:
  SimpleFieldNotation | ComplexFieldNotation;

SimpleFieldNotation:
  name=FieldNotationNameSource ':' value=SimpleValueLink;

ComplexFieldNotation:
  name=FieldNotationNameSource ':'? values=MessageNotation;

FieldNotationNameSource:
  NormalFieldNotationNameSource | ExtensionFieldNotationNameSource;

NormalFieldNotationNameSource:
  property=[MessageField];

ExtensionFieldNotationNameSource:
  '[' extension=[MessageField|QualifiedName] ']';

SimpleValueLink:
  LiteralLink | BooleanLink | NumberLink | StringLink;

LiteralLink:
  target=[Literal];

BooleanLink:
  target=BOOL;

enum BOOL:
  true
  | false;

NumberLink:
  HexNumberLink | LongLink | DoubleLink;

HexNumberLink:
  target=HEX;

LongLink:
  target=LONG;

terminal LONG returns ecore::ELong:
  ('-')? (NUMBER)+;

DoubleLink:
  target=DOUBLE;

terminal DOUBLE returns ecore::EDouble:
  (('-')? (NUMBER)* ('.' (NUMBER)+)? (('e'|'E')('-')? (NUMBER)+)?) | 'nan' | 'inf' | '-inf';

terminal NUMBER:
  '0'..'9';

StringLink:
  target=STRING;

terminal STRING:
  SL_STRING (SL_STRING)*;

terminal SL_STRING:
  '"' ('\\' ('"' | "'" | '\\' | !('\\' | '"')) | !('\\' | '"'))* '"' (WS)* |
  "'" ('\\' ('"' | "'" | '\\' | !('\\' | "'")) | !('\\' | "'"))* "'" (WS)*;

terminal ID: '^'?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
terminal ML_COMMENT: '/*' -> '*/';
terminal SL_COMMENT: '//' !('\n'|'\r')* ('\r'? '\n')?;
terminal WS: (' '|'\t'|'\r'|'\n')+;
terminal ANY_OTHER: .;
