Commit b7e10307 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

work on signature and template references

parent 0de3deb4
Loading
Loading
Loading
Loading
+15 −18
Original line number Diff line number Diff line
@@ -190,14 +190,14 @@ SystemSpec:
	SYSTEMKEYWORD component=[ComponentDef|IDENTIFIER];

SignatureDef:
	SIGNATUREKEYWORD name=IDENTIFIER LPAREN params=SignatureFormalParList? RPAREN (return=ReturnType | NOBLOCKKEYWORD)?
	SIGNATUREKEYWORD name=IDENTIFIER LPAREN paramList=SignatureFormalParList? RPAREN (return=ReturnType | NOBLOCKKEYWORD)?
	sprec=ExceptionSpec?;

ExceptionSpec:
	EXCEPTIONKEYWORD LPAREN TypeList RPAREN;

SignatureFormalParList:
	value+=FormalValuePar (COMMA value+=FormalValuePar)*;
	params+=FormalValuePar (COMMA params+=FormalValuePar)*;

ModuleControlPart:
	CONTROLKEYWORD LBRACKET body=ModuleControlBody RBRACKET ws=WithStatement? sc=SEMICOLON?;
@@ -384,7 +384,7 @@ ValueSpec:
	VALUEKEYWORD (VariableRef | (LPAREN specs+=SingleValueSpec (COMMA specs+=SingleValueSpec)* RPAREN));

SingleValueSpec:
	variable=VariableRef (ASSIGNMENTCHAR field=FieldReference ext+=ExtendedFieldReference*)?;
	variable=VariableRef (ASSIGNMENTCHAR field=[FieldReference|IDENTIFIER] ext+=ExtendedFieldReference*)?;

AltGuardChar:
	{AltGuardChar} SQUAREOPEN expr=BooleanExpression? SQUARECLOSE;
@@ -815,7 +815,7 @@ AllowedValuesSpec:
	LPAREN ((template+=TemplateOrRange (COMMA template+=TemplateOrRange)*) | CharStringMatch) RPAREN;

TemplateOrRange:
	RangeDef | TemplateBody | Type;
	range=RangeDef | template=TemplateBody | type=Type;

RangeDef:
	b1=Bound RANGEOP b2=Bound;
@@ -869,7 +869,7 @@ FieldSpecList:
	LBRACKET spec+=FieldSpec (COMMA spec+=FieldSpec)* RBRACKET;

FieldSpec:
	ref=[StructFieldDef|IDENTIFIER] ASSIGNMENTCHAR (body=TemplateBody | MINUS);
	ref=[FieldReference|IDENTIFIER] ASSIGNMENTCHAR (body=TemplateBody | MINUS);

SimpleSpec:
	expr=SingleExpression (STRINGOP spec=SimpleTemplateSpec)? | spec=SimpleTemplateSpec;
@@ -1014,7 +1014,7 @@ ArrayElementExpressionList:
	expr+=NotUsedOrExpression (COMMA expr+=NotUsedOrExpression)*;

FieldExpressionSpec:
	fieldRef=FieldReference ASSIGNMENTCHAR expr=NotUsedOrExpression;
	(fieldRef=[FieldReference|IDENTIFIER] | type=PredefinedType) ASSIGNMENTCHAR expr=NotUsedOrExpression;

NotUsedOrExpression:
	Expression | {NotUsedOrExpression} MINUS;
@@ -1029,7 +1029,7 @@ FieldConstExpressionList:
	LBRACKET specs+=FieldConstExpressionSpec (COMMA specs+=FieldConstExpressionSpec)* RBRACKET;

FieldConstExpressionSpec:
	fieldRef=FieldReference ASSIGNMENTCHAR constExpr=ConstantExpression;
	(fieldRef=[FieldReference|IDENTIFIER] | type=PredefinedType) ASSIGNMENTCHAR constExpr=ConstantExpression;

ArrayConstExpression:
	{ArrayConstExpression} LBRACKET list=ArrayElementConstExpressionList? RBRACKET;
@@ -1047,7 +1047,7 @@ ReferencedValue:
	ref=[RefValue|IDENTIFIER] ext+=ExtendedFieldReference*;

RefValue:
	SingleConstDef | ModuleParameter | SingleVarInstance | FormalValuePar | FormalTemplatePar;
	SingleConstDef | ModuleParameter | SingleVarInstance | FieldReference | FormalTemplatePar;

	// IDENTIFIER omitted
PredefinedValue:
@@ -1117,8 +1117,9 @@ AllRef returns ecore::EString:

	// TODO: improve references
// StructFieldRef | ArrayOrBitRef | ParRef;
// ParRef -> RefValue
FieldReference:
	ArrayOrBitRef | StructFieldRef;
	StructFieldDef | FormalValuePar;

ArrayOrBitRef:
	SQUAREOPEN FieldOrBitNumber SQUARECLOSE;
@@ -1133,23 +1134,19 @@ ArrayElementSpecList:
	spec+=ArrayElementSpec (COMMA spec+=ArrayElementSpec)*;

ArrayElementSpec:
	{ArrayElementSpec} MINUS | PermutationMatch | TemplateBody;
	{ArrayElementSpec} MINUS | match=PermutationMatch | body=TemplateBody;

TimerOps:
	ReadTimerOp | RunningTimerOp;
	read=ReadTimerOp | run=RunningTimerOp;

RunningTimerOp:
	TimerRefOrAny DOT RUNNINGKEYWORD;
	timerRef=TimerRefOrAny DOT RUNNINGKEYWORD;

ReadTimerOp:
	ArrayIdentifierRef DOT READKEYWORD;
	arrayRed=ArrayIdentifierRef DOT READKEYWORD;

PermutationMatch:
	PERMUTATIONKEYWORD ListOfTemplates;

	// TODO: complete this rule parRef! TypeReference
StructFieldRef:
	ref=[StructFieldDef|IDENTIFIER] | {StructFieldRef} PredefinedType;
	PERMUTATIONKEYWORD list=ListOfTemplates;

ExtendedFieldReference:
	DOT (field+=ReferencedValue | type+=PredefinedType) | array+=ArrayOrBitRef | {ExtendedFieldReference} SQUAREOPEN
+6 −1
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ import de.ugoe.cs.swe.tTCN3.UnionDefNamed
import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed
import de.ugoe.cs.swe.tTCN3.SetOfDefNamed
import de.ugoe.cs.swe.tTCN3.EnumDefNamed
import de.ugoe.cs.swe.tTCN3.FormalValuePar
import de.ugoe.cs.swe.tTCN3.SignatureDef

class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

@@ -132,6 +134,9 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		if (type != null && type.ref != null && typeof(RecordDefNamed).isAssignableFrom(type.ref.class)) {
			inner.addAll((type.ref as RecordDefNamed).body.defs)
		}		
		if (type != null && type.ref != null && typeof(SignatureDef).isAssignableFrom(type.ref.class)) {
			inner.addAll((type.ref as SignatureDef).paramList.params)
		}		
		scopeFor(inner)
	}

+2 −12
Original line number Diff line number Diff line
@@ -53,16 +53,6 @@ import org.eclipse.xtext.validation.Check

import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*

class TypeAttribs {
	String name
	EStructuralFeature feature

	new(String name, EStructuralFeature feature) {
		this.name = name
		this.feature = feature
	}
}

class TTCN3Validator extends AbstractTTCN3Validator {

	@Check
@@ -77,7 +67,7 @@ class TTCN3Validator extends AbstractTTCN3Validator {
		val container = field.findDesiredParent(typeof(ModuleDefinitionsList)) as ModuleDefinitionsList
		if (container.checkNameClashModuleDefinitionsList(field, field.name)) {
			error('Name clash with another variable definition in this scope!',
				TTCN3Package.eINSTANCE.structFieldDef_Name);
				TTCN3Package.eINSTANCE.refValue_Name);
			return;
		}

@@ -86,7 +76,7 @@ class TTCN3Validator extends AbstractTTCN3Validator {
		for (StructFieldDef f : body.defs) {
			if (f != field && f.name.equals(field.name)) {
				error('Name clash with another variable definition in this scope!',
					TTCN3Package.eINSTANCE.structFieldDef_Name);
					TTCN3Package.eINSTANCE.refValue_Name);
				return;
			}
		}