Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 19f15c6282b9d5b8bc5f69115a1eb0067175cde8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*******************************************************************************
 * Copyright (c) 2013 protos software gmbh (http://www.protos.de).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * CONTRIBUTORS:
 * 		Juergen Haug and Thomas Schuetz (initial contribution)
 * 		Eyrak Paen
 * 
 *******************************************************************************/
grammar org.eclipse.etrice.core.common.Base with org.eclipse.xtext.common.Terminals

generate base "http://www.eclipse.org/etrice/core/common/Base"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

// **************************************************************
// AnnotationType and Annotation Rules

Annotation:'@' type=[AnnotationType|FQN] ('(' attributes+=KeyValue (',' attributes+=KeyValue)* ')')?
;
KeyValue: key=ID '=' value=Literal;

AnnotationType:
	'AnnotationType' name=ID (docu=Documentation)? '{'
	'target' '=' (targets+=(AnnotationTargetType) | ( '{' targets+=AnnotationTargetType (',' targets+=AnnotationTargetType)* '}'))
	attributes+=AnnotationAttribute*
	'}'
;

//
// Sub-grammars should use AnnotationTargetType to refer to 
// specific sub-grammar targets. For example, valid values for 
// AnnotationTargetType in the Room.xtext sub-grammar include "ActorClass", 
// "ActorBehavior", "ProtocolClass", etc. The sub-grammar is responsible for 
// implementing validation, quick-fixes, and code completion proposals via the 
// usual Xtext mechanisms.
//
AnnotationTargetType:
	ID
;

AnnotationAttribute: SimpleAnnotationAttribute | EnumAnnotationAttribute;

SimpleAnnotationAttribute:
	(optional?='optional' | 'mandatory') 'attribute' name=ID ':' type=LiteralType
;

EnumAnnotationAttribute:
	(optional?='optional' | 'mandatory') 'attribute' name=ID ':' '{' values+=STRING (',' values+=STRING)* '}'
;

// **************************************************************
// Import rules

// HOWTO: use a combination of URI global scopes and namespace aware local scope provider
// this is configured in the work flow by
//			fragment = scoping.ImportURIScopingFragment {}
// and by overriding configureIScopeProviderDelegate in the runtime module with 
//			ImportedNamespaceAwareLocalScopeProvider
// also configure in the RuntimeModule
//	public Class<? extends ImportUriResolver> bindImportUriResolver() {
//		return PlatformRelativeUriResolver.class;
//	}
// and in the UiRuntimeModule
//	public Class<? extends org.eclipse.xtext.ui.editor.IURIEditorOpener> bindIURIEditorOpener() {
//		return GlobalNonPlatformURIEditorOpener.class;
//	}
//	public Class<? extends IHyperlinkHelper> bindIHyperlinkHelper() {
//		return ImportAwareHyperlinkHelper.class;
//	}
// the attribute 'importedNamespace' is picked up by the ImportedNamespaceAwareLocalScopeProvider
// the attribute 'importURI' is picked up by the ImportUriGlobalScopeProvider
Import :
	'import' (importedNamespace=ImportedFQN 'from' | 'model') importURI=STRING;

ImportedFQN:
	FQN ('.*')?;

// **************************************************************
// Documentation Rule

Documentation:
	{Documentation}
	'['
		lines+=STRING*
	']';

// **************************************************************
// Time Rule

TIME returns ecore::ELong: (INT 's') | (INT 'ms') | (INT 'us') | (INT 'ns');

// **************************************************************
// Literal Rules

enum LiteralType:
	BOOL='ptBoolean' |
	INT='ptInteger' |
	REAL='ptReal' |
	CHAR='ptCharacter' 
;

LiteralArray:
	literals+=Literal (',' literals+=Literal)*;

	// Value Types for Attributes
Literal:
	BooleanLiteral |
	NumberLiteral |
	StringLiteral;

BooleanLiteral:
	{BooleanLiteral} ('false' | isTrue?='true');

NumberLiteral:
	IntLiteral | RealLiteral;

RealLiteral:
	{RealLiteral} value=Real;

IntLiteral:
	{IntLiteral} value=Integer;

StringLiteral:
	{StringLiteral} value=STRING;

Integer returns ecore::ELong:
	(('+' | '-')? INT) | HEX;

Real returns ecore::EDouble:
	Decimal | /*DotDecimal | DecimalDot |*/ DecimalExp;

Decimal hidden():
	('+' | '-')? INT '.' INT;

//DotDecimal hidden():
//	('+' | '-')? '.' INT;
//
//DecimalDot hidden():
//	('+' | '-')? INT '.';

DecimalExp hidden():
	('+' | '-')? INT '.' INT ('e' | 'E') ('+' | '-')? INT;

FQN:
	ID ('.' ID)*;

terminal HEX:
	('0x' | '0X') ('0'..'9' | 'a'..'f' | 'A'..'F')+;
	
terminal CC_STRING:
	"'''" -> "'''";

Back to the top