diff --git a/com.minres.coredsl/src/com/minres/coredsl/CoreDsl.xtext b/com.minres.coredsl/src/com/minres/coredsl/CoreDsl.xtext index 847938f..8bfe2ec 100644 --- a/com.minres.coredsl/src/com/minres/coredsl/CoreDsl.xtext +++ b/com.minres.coredsl/src/com/minres/coredsl/CoreDsl.xtext @@ -91,17 +91,17 @@ ReturnStatement: {ReturnStatement} t_return='return' value=ConditionalExpression LoopStatement: WhileLoop | ForLoop | DoLoop; WhileLoop: - 'while' '(' condition=Expression ')' body=Statement; + 'while' '(' condition=Expression ')' attributes+=Attribute* body=Statement; ForLoop: 'for' '(' (startDeclaration=MultiInitDeclaration | startExpression=AssignmentExpression?) ';' (condition=Expression?) ';' (loopExpressions+=AssignmentExpression (',' loopExpressions+=AssignmentExpression)*)? - ')' body=Statement; + ')' attributes+=Attribute* body=Statement; DoLoop: - 'do' body=Statement 'while' '(' condition=Expression ')' ';'; + 'do' body=Statement 'while' '(' condition=Expression ')' attributes+=Attribute* ';'; ////////////////////////////////////////////////////////////////////////////// //////////////////////////////// Declarations //////////////////////////////// diff --git a/com.minres.coredsl/src/com/minres/coredsl/analysis/AttributeRegistry.xtend b/com.minres.coredsl/src/com/minres/coredsl/analysis/AttributeRegistry.xtend index b73b9cd..e66d7bb 100644 --- a/com.minres.coredsl/src/com/minres/coredsl/analysis/AttributeRegistry.xtend +++ b/com.minres.coredsl/src/com/minres/coredsl/analysis/AttributeRegistry.xtend @@ -35,7 +35,8 @@ class AttributeRegistry { instruction, function, declarator, - alwaysBlock + alwaysBlock, + loop } static final class AttributeInfo { diff --git a/com.minres.coredsl/src/com/minres/coredsl/analysis/CoreDslAnalyzer.xtend b/com.minres.coredsl/src/com/minres/coredsl/analysis/CoreDslAnalyzer.xtend index a231a2d..33fcf91 100644 --- a/com.minres.coredsl/src/com/minres/coredsl/analysis/CoreDslAnalyzer.xtend +++ b/com.minres.coredsl/src/com/minres/coredsl/analysis/CoreDslAnalyzer.xtend @@ -581,6 +581,9 @@ class CoreDslAnalyzer { * 2. [Warning] The condition should not be an assignment. (LikelyAccidentalAssignment) */ def static dispatch void analyzeStatement(AnalysisContext ctx, WhileLoop statement) { + + analyzeAttributes(ctx, statement.attributes, AttributeRegistry.AttributeUsage.loop); + val conditionType = analyzeExpression(ctx, statement.condition); checkAccidentalAssignment(ctx, statement.condition); @@ -601,6 +604,8 @@ class CoreDslAnalyzer { */ def static dispatch void analyzeStatement(AnalysisContext ctx, ForLoop statement) { + analyzeAttributes(ctx, statement.attributes, AttributeRegistry.AttributeUsage.loop); + if (statement.startDeclaration !== null) { analyzeDeclaration(ctx, statement.startDeclaration, false); } @@ -641,6 +646,9 @@ class CoreDslAnalyzer { * 2. [Warning] The condition should not be an assignment. (LikelyAccidentalAssignment) */ def static dispatch void analyzeStatement(AnalysisContext ctx, DoLoop statement) { + + analyzeAttributes(ctx, statement.attributes, AttributeRegistry.AttributeUsage.loop); + val conditionType = analyzeExpression(ctx, statement.condition); checkAccidentalAssignment(ctx, statement.condition);