/******************************************************************************* * 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 bindImportUriResolver() { // return PlatformRelativeUriResolver.class; // } // and in the UiRuntimeModule // public Class bindIURIEditorOpener() { // return GlobalNonPlatformURIEditorOpener.class; // } // public Class 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: "'''" -> "'''";