blob: 8386c6d87f53094ccfe0c77f0531ee0ecd9293c7 [file] [log] [blame]
/*
* 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)*;
Option:
BuiltInOption | CustomOption;
BuiltInOption:
'option' name=Name '=' value=ValueRef ';';
CustomOption:
'option' '(' name=QualifiedName ')' '=' value=ValueRef ';';
Type:
Message | Enum;
Message:
'message' name=Name '{'
elements+=MessageElement*
'}' (';')?;
MessageElement:
Extensions | Type | Field | ExtendMessage | Option;
Extensions:
'extensions' ranges+=Range (',' ranges+=Range)* ';';
Range:
from=INT ('to' to=RangeMax)?;
RangeMax:
INT | 'max';
Field:
Property | Group;
Group:
modifier=Modifier 'group' name=Name '=' index=(INT | HEX)
('[' (fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)*) ']')? '{'
elements+=GroupElement*
'}' (';')?;
GroupElement:
Field | Option | Enum;
Property:
modifier=Modifier type=AbstractTypeRef name=Name '=' index=(INT | 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:
LiteralRef | BooleanRef | NumberRef | StringRef | Nan;
LiteralRef:
literal=[Literal];
BooleanRef:
boolean=BOOL;
enum BOOL:
true
| false;
NumberRef:
HexRef | IntRef | LongRef | FloatRef | DoubleRef;
HexRef:
hex=HEX;
IntRef:
int=INT;
terminal INT returns ecore::EInt:
SIGNED_INT;
LongRef:
long=LONG;
terminal LONG returns ecore::ELong:
SIGNED_INT;
terminal SIGNED_INT:
('-')? (NUMBER)+;
FloatRef:
float=FLOAT;
terminal FLOAT returns ecore::EFloat:
DECIMAL;
DoubleRef:
double=DOUBLE;
terminal DOUBLE returns ecore::EDouble:
DECIMAL;
terminal DECIMAL:
('-')? (NUMBER)* ('.' (NUMBER)+)?;
StringRef:
string=STRING;
terminal STRING:
SL_STRING (SL_STRING)*;
terminal SL_STRING:
'"' ('\\' ('b' | 't' | 'n' | 'f' | 'r' | 'u' | '"' | "'" | '\\') | !('\\' | '"'))* '"' (WS)*;
Nan:
number='nan';
Enum:
'enum' name=Name '{'
elements+=EnumElement*
'}' ';'?;
EnumElement:
Option | Literal;
Literal:
name=Name '=' index=(INT | HEX)
('[' fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)* ']')? ';';
FieldOption:
BuiltInFieldOption | CustomFieldOption;
BuiltInFieldOption:
name=Name '=' value=ValueRef;
CustomFieldOption:
'(' name=QualifiedName ')' '=' value=ValueRef;
terminal HEX returns ecore::EInt:
'0x' (NUMBER | 'a'..'f' | 'A'..'F')+;
terminal NUMBER:
'0'..'9';
ExtendMessage:
'extend' message=MessageRef '{'
elements+=MessageElement*
'}' (';')?;
Service:
'service' name=Name '{'
rpcs+=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];