/*
 * 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:
  (package=Package)?
  (imports+=Import)*
  (options+=Option)*
  (elements+=ProtobufElement)*;
  
Package:
  'package' name=QualifiedName ';';

Import: 
  'import' importURI=STRING ';';

QualifiedName:
  ID ('.' ID)*;

Option:
  'option' name=ID '=' value=ValueRef ';';

ProtobufElement:
  Type | ExtendMessage;

Type:
  Message | Enum;

Message:
  'message' name=ID '{'
  elements+=MessageElement*
  ('extensions' extensionsFrom=INT 'to' (extensionsTo=INT | 'max') ';')?
  '}';

MessageElement:
  Type | Property;

Property:
  modifier=Modifier type=AbstractTypeReference name=ID '=' index=INT (('[' 'default' '=' default=ValueRef
  ']') | ('[' 'packed' '=' packed=BooleanRef ']'))? ';';

enum Modifier:
  required
  | optional
  | repeated;

AbstractTypeReference:
  ScalarTypeReference | TypeReference;

ScalarTypeReference:
  scalar=ScalarType;

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

TypeReference:
  type=[Type | QualifiedName];

ValueRef:
  LiteralRef
  | BooleanRef
  | IntRef
  | FloatRef
  | StringRef;

LiteralRef:
  literal=[Literal];

BooleanRef:
  boolean=BOOL;

enum BOOL:
  true
  | false;

IntRef:
  int=INT;

FloatRef:
  float=FLOAT;

StringRef:
  string=STRING;

Enum:
  'enum' name=ID '{'
  literals+=Literal*
  '}' ';'?;

Literal:
  name=ID '=' index=INT ';';

ExtendMessage:
  'extend' message=[Message] '{'
  elements+=MessageElement*
  '}';

terminal INT returns ecore::EInt: ('0'..'9')+;  
terminal FLOAT returns ecore::EFloat: ('0'..'9')* ('.' ('0'..'9')+)?;
  