From e6097c305619f102f2cb951fb2aa998445a1ede2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Doser?= Date: Fri, 23 Feb 2007 12:51:22 +0000 Subject: [PATCH] removed ADT for cartridge languages git-svn-id: https://projects.brucker.ch/su4sml/svn/infsec-import/trunk/src/su4sml@6197 3260e6d1-4efc-4170-b0a7-36055960796d --- Makefile | 2 +- STATUS | 6 +- src/codegen/codegen.sml | 165 ++++++++++++++++++++-------------------- src/rep_su2holocl.sml | 4 +- src/xmltree_parser.sml | 17 ++--- 5 files changed, 98 insertions(+), 96 deletions(-) diff --git a/Makefile b/Makefile index d7f9530..7d8a89a 100644 --- a/Makefile +++ b/Makefile @@ -21,5 +21,5 @@ repsecure_parser: ml-build src/su4sml.cm Rep_SecureUML_ComponentUML.test src/repsecure_parser codegen: - ml-build src/codegen/codegen.cm Codegen.main src/codegen + ml-build src/codegen/codegen.cm Codegen.main codegen diff --git a/STATUS b/STATUS index 5b3c10e..08d6d88 100644 --- a/STATUS +++ b/STATUS @@ -70,8 +70,8 @@ Package | xmi_* does not distinguish between models, packages, ModelElement | Status --------------------------+--------------------------------------------------- Transition | -Event | no support for TimeEvent and ChangeEvent - (SignalEven, CallEvent) | +Event | currently only support for CallEvent. + (SignalEvent, CallEvent)| Guard | the guard's expression is just a string PseudoStateVars | StateVertex | no support for StubState's @@ -154,7 +154,7 @@ AttributeCallExp | ok OperationCallExp | ok OperationWithTypeCallExp | ok LetExp: | ok -IteratorExp | ok +IteratorExp | ok IterateExp | ok PrimitiveLiteralExp | ok (called "LiteralExp" in current code) CollectionLiteralExp | only support for empty collections, diff --git a/src/codegen/codegen.sml b/src/codegen/codegen.sml index 347d1a7..9931c38 100644 --- a/src/codegen/codegen.sml +++ b/src/codegen/codegen.sml @@ -58,94 +58,97 @@ structure SecureMova_Gcg = GCG_Core (ComponentUML_Cartridge(Base_Cartridge)) structure JavaSecure_Gcg = GCG_Core (Java_Cartridge(SecureUML_Cartridge(Base_Cartridge))); *) -datatype language = base | cSharp | cSharpSecure | dotNet | dotNetSecure - | cSharpSM | java | junit | javaocl | securemova - -(* FIXME: instead of the next two functions, one could put the *) -(* information into the cartridge_list. That way, one would have *) -(* to change 2 places less when adding a new cartridge. *) -val parse_language = - fn "base" => base - | "c#" => cSharp - | "c#_secure" => cSharpSecure - | "c#_net1" => dotNet - | "c#_secure_net1" => dotNetSecure - | "c#sm" => cSharpSM - | "java" => java - | "junit" => junit - | "javaocl" => javaocl - | "securemova" => securemova - -val language_name = - fn base => "base" - | cSharp => "c#" - | cSharpSecure => "c#_secure" - | dotNet => "c#_net1" - | dotNetSecure => "c#_secure_net1" - | cSharpSM => "c#sm" - | java => "java" - | junit => "junit" - | javaocl => "javaocl" - | securemova => "securemova" - - (* maybe this should also hav a "description" field? *) -type cartridge = {name : language, - generator: Rep.Model -> string -> unit, - parser : string -> Rep.Model, - template : string} +type cartridge = {lang : string, (* identifier (for input) *) + name : string, (* short description (for output) *) + description : string, (* long description *) + recommended : bool, (* presented to the end-user? *) + generator : Rep.Model -> string -> unit, + parser : string -> Rep.Model, + template : string} (* maybe these should be declared by the individual cartridges and simply concatenated here? *) -val cartridge_list = [ {name = base, - generator = Base_Gcg.generate, - parser = RepParser.readFile, - template = "base.tpl"}, - {name = cSharp, - generator = CSharp_Gcg.generate, - parser = RepParser.readFile, - template = "C#.tpl"}, - {name = cSharpSecure, - generator = CSharpSecure_Gcg.generate, - parser = RepParser.readFile, - template = "C#_SecureUML.tpl"}, - {name = dotNet, - generator = CSharp_NET1_Gcg.generate, - parser = RepParser.readFile, - template = "C#.pl"}, - {name = dotNetSecure, - generator = CSharpSecure_NET1_Gcg.generate, - parser = RepParser.readFile, - template = "C#_SecureUML.tpl"}, - {name = cSharpSM, - generator = CSharpSM_Gcg.generate, - parser = RepParser.readFile, - template = "C#_SM.tpl"}, - {name = java, - generator = Java_Gcg.generate, - parser = RepParser.readFile, - template = "java.tpl"}, - {name = junit, - generator = Junit_Gcg.generate, - parser = RepParser.readFile, - template = "junit.tpl"}, - {name = javaocl, - generator = Java_Ocl_Gcg.generate, - parser = RepParser.readFile, - template = "java_ocl.tpl"}, - {name = securemova, - generator = SecureMova_Gcg.generate, - parser = RepParser.transformXMI o XmiParser.readFile, - template = "securemova.tpl"}] +(* FIXME: add long descriptions *) +val cartridge_list = [ {lang = "base", + name = "Base Cartridge", + description = "", + recommended = false, + generator = Base_Gcg.generate, + parser = RepParser.readFile, + template = "base.tpl"}, + {lang = "c#", + name = "C# Cartridge", + description = "", + recommended = true, + generator = CSharp_Gcg.generate, + parser = RepParser.readFile, + template = "C#.tpl"}, + {lang = "c#_secure", + name = "C# SecureUML Cartridge", + description = "", + recommended = true, + generator = CSharpSecure_Gcg.generate, + parser = RepParser.readFile, + template = "C#_SecureUML.tpl"}, + {lang = "c#_net1", + name = "C# .NET1 Cartridge", + description = "", + recommended = true, + generator = CSharp_NET1_Gcg.generate, + parser = RepParser.readFile, + template = "C#.pl"}, + {lang = "c#_net1_secure", + name = "C# .NET1 SecureUML Cartridge", + description = "", + recommended = true, + generator = CSharpSecure_NET1_Gcg.generate, + parser = RepParser.readFile, + template = "C#_SecureUML.tpl"}, + {lang = "c#_sm", + name = "C# StateMachine Cartridge", + description = "", + recommended = true, + generator = CSharpSM_Gcg.generate, + parser = RepParser.readFile, + template = "C#_SM.tpl"}, + {lang = "java", + name = "Java Cartridge", + description = "", + recommended = true, + generator = Java_Gcg.generate, + parser = RepParser.readFile, + template = "java.tpl"}, + {lang = "junit", + name = "Junit Cartridge", + description = "", + recommended = true, + generator = Junit_Gcg.generate, + parser = RepParser.readFile, + template = "junit.tpl"}, + {lang = "java_ocl", + name = "Java OCL Cartridge", + description = "", + recommended = true, + generator = Java_Ocl_Gcg.generate, + parser = RepParser.readFile, + template = "java_ocl.tpl"}, + {lang = "securemova", + name = "SecureMOVA Cartridge", + description = "", + recommended = false, + generator = SecureMova_Gcg.generate, + parser = RepParser.transformXMI o XmiParser.readFile, + template = "securemova.tpl"}]:cartridge list -val supported_languages = map (language_name o #name) cartridge_list - -val string_of_languages = String.concatWith " | " supported_languages +val supported_languages = map #lang cartridge_list +val recommended_languages = map #lang (List.filter #recommended cartridge_list) +val string_of_languages = String.concatWith " | " recommended_languages fun is_supported lang = ListEq.includes supported_languages lang -fun cartridge_of lang = Option.valOf (List.find (fn c => #name c = lang) cartridge_list) +fun cartridge_of lang = Option.valOf (List.find (fn c => #lang c = lang) cartridge_list) fun generateFromModel model lang = @@ -162,8 +165,8 @@ fun generate xmi_file lang = generateFromModel ((#parser (cartridge_of lang)) xm fun print_usage () = print ("usage: codegen \n"^ "\tlanguage = "^string_of_languages ^"\n") -fun main (_,[xmi_file,lang]) = ((if is_supported lang - then generate xmi_file (parse_language lang) +fun main (_,[xmi_file,lang]) = ((if is_supported lang + then generate xmi_file lang else print_usage ()); OS.Process.success) (* | main (_,[xmi_file,lang,template]) = (generate_with_template ; OS.Process.success) *) diff --git a/src/rep_su2holocl.sml b/src/rep_su2holocl.sml index b8b0df8..fd56d32 100644 --- a/src/rep_su2holocl.sml +++ b/src/rep_su2holocl.sml @@ -34,14 +34,14 @@ open Rep_SecureUML_ComponentUML (** capitalize the string s. * Returns the given string with the first letter changed to upper case - * Should be moved to a helper library? + * Should be moved to a helper library? (StringHandling.sml) *) fun capitalize s = let val slist = String.explode s in String.implode (Char.toUpper (List.hd slist)::List.tl slist) end - +(* can this be expressed more combinatorially? *) fun deep_atpre (t as Literal _) = t | deep_atpre (t as CollectionLiteral _) = t | deep_atpre (t as If (cond,cond_type,then_term,then_type, diff --git a/src/xmltree_parser.sml b/src/xmltree_parser.sml index 920c8f3..d281100 100644 --- a/src/xmltree_parser.sml +++ b/src/xmltree_parser.sml @@ -42,15 +42,14 @@ fun readFile filename = (* how to do the following in a clean/portable way? *) fun read_dtd dtd = (OS.FileSys.chDir (su4sml_home()); - (* dummy check to see if the file exists...*) - OS.FileSys.fileSize "UML15OCL.xmi" ; - (Parser.parseDocument - (SOME (Uri.String2Uri ("file:UML15OCL.xmi"))) - (SOME dtd) (dtd,nil,nil) - handle ex => (error_msg ("Error while reading file UML15OCL.xmi: "^ - General.exnMessage ex); - raise ex)); - OS.FileSys.chDir currentDir ) + (* check to see if the DTD file exists. *) + if OS.FileSys.access ("UML15OCL.xmi",[]) then + (Parser.parseDocument + (SOME (Uri.String2Uri ("file:UML15OCL.xmi"))) + (SOME dtd) (dtd,nil,nil)) + else error ("Error while reading file UML15OCL.xmi: "^ + "no such file or directory"); + OS.FileSys.chDir currentDir) fun read_file dtd filename = if filename = "-"