/*
 * 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 with org.eclipse.xtext.common.Terminals

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 | Type | ExtendMessage | Service;

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

Import:
  RegularImport | PublicImport;

RegularImport:
  'import' importURI=STRING ';';

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

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

Type:
  Message | Enum;

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

MessageElement:
  Option | Extensions | Type | Field | ExtendMessage;

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

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

RangeMax:
  LONG | 'max';

Field:
  Property | Group;

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

GroupElement:
  Option | Field | Enum;

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

enum Modifier:
  required
  | optional
  | repeated;

AbstractTypeRef:
  ScalarTypeRef | TypeRef;

ScalarTypeRef:
  scalar=ScalarType;

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

TypeRef:
  type=[Type|QualifiedName];

ValueRef:
  MessageNotation | SimpleRef;

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

FieldNotation:
  name=Name ':' value=SimpleRef;

SimpleRef:
	LiteralRef | BooleanRef | NumberRef | StringRef;

LiteralRef:
  literal=[Literal];

BooleanRef:
  boolean=BOOL;

enum BOOL:
  true
  | false;

NumberRef:
  HexRef | LongRef | DoubleRef;

HexRef:
  hex=HEX;

LongRef:
  long=LONG;

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

DoubleRef:
  double=DOUBLE;

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

StringRef:
  string=STRING;

terminal STRING:
  SL_STRING (SL_STRING)*;

terminal SL_STRING:
  '"' ('\\' ('b' | 't' | 'n' | 'f' | 'r' | 'u' | '"' | "'" | '\\' | UNICODE_OCTAL) | !('\\' | '"'))* '"' (WS)* |
  "'" ('\\' ('b' | 't' | 'n' | 'f' | 'r' | 'u' | '"' | "'" | '\\' | UNICODE_OCTAL) | !('\\' | "'"))* "'" (WS)*;

terminal UNICODE_OCTAL:
  ('0'..'3')('0'..'7')('0'..'7');

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')+;

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

ExtendMessage:
  'extend' message=MessageRef '{'
  elements+=MessageElement*
  '}' (';')?;

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

ServiceElement:
  Option | Rpc;

Rpc:
  'rpc' name=Name '(' argType=MessageRef ')' 'returns' '(' returnType=MessageRef ')'
  (('{' 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';

MessageRef:
  type=[Message|QualifiedName];

Option:
  NativeOption | CustomOption;

NativeOption:
  'option' property=PropertyRef '=' value=ValueRef ';';

CustomOption:
  'option' '(' property=PropertyRef ')'('.' propertyField = SimplePropertyRef)? '=' value=ValueRef ';';

FieldOption:
  DefaultValueFieldOption | NativeFieldOption | CustomFieldOption;

DefaultValueFieldOption:
  'default' '=' value=ValueRef;

NativeFieldOption:
  property=PropertyRef '=' value=ValueRef;

CustomFieldOption:
  '(' property=PropertyRef ')'('.' propertyField = SimplePropertyRef)? '=' value=ValueRef;

PropertyRef:
  property=[Property|QualifiedName];

SimplePropertyRef:
  property=[Property];  