Browse Source

Added escaping of c keywords.

markus.muehlbrandt@gmail.com 13 years ago
parent
commit
27722e9e8f

+ 1 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/FlowCode.xtend

@@ -113,7 +113,7 @@ class FlowCode {
 	'''
 	
 	def dispatch code(EnterState it) '''
-		«scHandle»->stateConfVector[«state.stateVector.offset»] = «state.name.asIdentifier»;
+		«scHandle»->stateConfVector[«state.stateVector.offset»] = «state.name.asEscapedIdentifier»;
 		«scHandle»->stateConfVectorPosition = «state.stateVector.offset»;
 	'''
 

+ 19 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/INaming.java

@@ -0,0 +1,19 @@
+package org.yakindu.sct.generator.c;
+
+public interface INaming {
+	public static final String[] C_KEYWORDS = { "alignas", "alignof", "and",
+			"and_eq", "asm", "auto", "bitand", "bitor", "bool", "break",
+			"case", "catch", "char", "char16_t", "char32_t", "class", "compl",
+			"const", "constexpr", "const_cast", "continue", "decltype",
+			"default", "delete", "do", "double", "dynamic_cast", "else",
+			"enum", "explicit", "export", "extern", "false", "float", "for",
+			"friend", "goto", "if", "inline", "int", "long", "mutable",
+			"namespace", "new", "noexcept", "not", "not_eq", "nullptr",
+			"operator", "or", "or_eq", "private", "protected", "public",
+			"register", "reinterpret_cast", "return", "short", "signed",
+			"sizeof", "static", "static_assert", "static_cast", "struct",
+			"switch", "template", "this", "thread_local", "throw", "true",
+			"try", "typedef", "typeid", "typename", "union", "unsigned",
+			"using", "virtual", "void", "volatile", "wchar_t", "while", "xor",
+			"xor_eq"};
+}

+ 26 - 4
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Naming.xtend

@@ -1,6 +1,7 @@
 package org.yakindu.sct.generator.c
 
 import com.google.inject.Inject
+import java.util.Arrays
 import java.util.List
 import org.eclipse.emf.ecore.EObject
 import org.yakindu.sct.model.sexec.ExecutionFlow
@@ -17,8 +18,10 @@ import org.yakindu.sct.model.stext.stext.VariableDefinition
 import org.yakindu.sct.model.sgraph.Event
 import org.yakindu.sct.model.stext.naming.StextNameProvider
 import org.yakindu.sct.model.sgraph.State
+import java.util.regex.Pattern
+import java.util.regex.Matcher
 
-class Naming {
+class Naming implements INaming{
 
 	@Inject
 	extension Navigation
@@ -27,10 +30,10 @@ class Naming {
 	extension Base
 	
 	@Inject
-	private StextNameProvider provider;
+	private StextNameProvider provider
 	
 	def getFullyQualifiedName(State state) {
-		provider.getFullyQualifiedName(state).toString.asIdentifier
+		provider.getFullyQualifiedName(state).toString.asEscapedIdentifier
 	}
 	
 	def module(ExecutionFlow it) {
@@ -218,6 +221,13 @@ class Naming {
 		replaceAll('[^a-z&&[^A-Z&&[^0-9]]]', '_')
 	}
 	
+	def asEscapedIdentifier(String it) {
+		var s = it
+		if (s.isCKeyword) {
+			s = s + '_ID'
+		}
+		return s.asIdentifier
+	} 
 	
 	def dispatch scopeDescription(Scope it) '''scope'''
 	
@@ -235,7 +245,7 @@ class Naming {
 	
 	/** todo externalize */
 	def dispatch access (VariableDefinition it) 
-		'''«scHandle»->«scope.instance».«name.asIdentifier»'''
+		'''«scHandle»->«scope.instance».«name.asEscapedIdentifier»'''
 
 	/** todo externalize */
 	def dispatch access (OperationDefinition it) 
@@ -251,4 +261,16 @@ class Naming {
 	
 	def valueAccess(Event it) 
 		'''«scHandle»->«scope.instance».«name.asIdentifier.value»'''
+		
+	def boolean isCKeyword(String name) {
+		var String lowName = name.toLowerCase();
+		for (String keyword : Arrays::asList(C_KEYWORDS)) {
+			var Pattern pattern = Pattern::compile("^" + keyword + "$");
+			var Matcher matcher = pattern.matcher(lowName);
+			if (matcher.find()) {
+				return true;
+			}
+		}
+		return false;
+	}
 }

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Statemachine.xtend

@@ -81,7 +81,7 @@ class Statemachine {
 		//! enumeration of all states 
 		typedef enum {
 			«FOR state : states »
-			«state.name.asIdentifier» ,
+			«state.name.asEscapedIdentifier» ,
 			«ENDFOR»
 			«last_state»
 		} «statesEnumType»;
@@ -98,7 +98,7 @@ class Statemachine {
 	'''
 
 	def dispatch structDeclaration(VariableDefinition it) '''
-		«IF type.name != 'void'»«type.cPrimitive»  «name.asIdentifier»;«ENDIF»
+		«IF type.name != 'void'»«type.cPrimitive»  «name.asEscapedIdentifier»;«ENDIF»
 	'''
 	
 	def dispatch structDeclaration(Declaration it) ''''''

+ 1 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineC.xtend

@@ -131,7 +131,7 @@ class StatemachineC {
 				switch («scHandle»->stateConfVector[handle->stateConfVectorPosition]) {
 				«FOR state : states»
 					«IF state.reactSequence!=null»
-					case «state.name.asIdentifier» : {
+					case «state.name.asEscapedIdentifier» : {
 						«state.reactSequence.functionName»(«scHandle»);
 						break;
 					}