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
This commit is contained in:
parent
ddfe7c84cd
commit
e6097c3056
2
Makefile
2
Makefile
|
@ -21,5 +21,5 @@ repsecure_parser:
|
||||||
ml-build src/su4sml.cm Rep_SecureUML_ComponentUML.test src/repsecure_parser
|
ml-build src/su4sml.cm Rep_SecureUML_ComponentUML.test src/repsecure_parser
|
||||||
|
|
||||||
codegen:
|
codegen:
|
||||||
ml-build src/codegen/codegen.cm Codegen.main src/codegen
|
ml-build src/codegen/codegen.cm Codegen.main codegen
|
||||||
|
|
||||||
|
|
6
STATUS
6
STATUS
|
@ -70,8 +70,8 @@ Package | xmi_* does not distinguish between models, packages,
|
||||||
ModelElement | Status
|
ModelElement | Status
|
||||||
--------------------------+---------------------------------------------------
|
--------------------------+---------------------------------------------------
|
||||||
Transition |
|
Transition |
|
||||||
Event | no support for TimeEvent and ChangeEvent
|
Event | currently only support for CallEvent.
|
||||||
(SignalEven, CallEvent) |
|
(SignalEvent, CallEvent)|
|
||||||
Guard | the guard's expression is just a string
|
Guard | the guard's expression is just a string
|
||||||
PseudoStateVars |
|
PseudoStateVars |
|
||||||
StateVertex | no support for StubState's
|
StateVertex | no support for StubState's
|
||||||
|
@ -154,7 +154,7 @@ AttributeCallExp | ok
|
||||||
OperationCallExp | ok
|
OperationCallExp | ok
|
||||||
OperationWithTypeCallExp | ok
|
OperationWithTypeCallExp | ok
|
||||||
LetExp: | ok
|
LetExp: | ok
|
||||||
IteratorExp | ok
|
IteratorExp | ok
|
||||||
IterateExp | ok
|
IterateExp | ok
|
||||||
PrimitiveLiteralExp | ok (called "LiteralExp" in current code)
|
PrimitiveLiteralExp | ok (called "LiteralExp" in current code)
|
||||||
CollectionLiteralExp | only support for empty collections,
|
CollectionLiteralExp | only support for empty collections,
|
||||||
|
|
|
@ -58,94 +58,97 @@ structure SecureMova_Gcg = GCG_Core (ComponentUML_Cartridge(Base_Cartridge))
|
||||||
structure JavaSecure_Gcg = GCG_Core (Java_Cartridge(SecureUML_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? *)
|
(* maybe this should also hav a "description" field? *)
|
||||||
type cartridge = {name : language,
|
type cartridge = {lang : string, (* identifier (for input) *)
|
||||||
generator: Rep.Model -> string -> unit,
|
name : string, (* short description (for output) *)
|
||||||
parser : string -> Rep.Model,
|
description : string, (* long description *)
|
||||||
template : string}
|
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? *)
|
(* maybe these should be declared by the individual cartridges and simply concatenated here? *)
|
||||||
val cartridge_list = [ {name = base,
|
(* FIXME: add long descriptions *)
|
||||||
generator = Base_Gcg.generate,
|
val cartridge_list = [ {lang = "base",
|
||||||
parser = RepParser.readFile,
|
name = "Base Cartridge",
|
||||||
template = "base.tpl"},
|
description = "",
|
||||||
{name = cSharp,
|
recommended = false,
|
||||||
generator = CSharp_Gcg.generate,
|
generator = Base_Gcg.generate,
|
||||||
parser = RepParser.readFile,
|
parser = RepParser.readFile,
|
||||||
template = "C#.tpl"},
|
template = "base.tpl"},
|
||||||
{name = cSharpSecure,
|
{lang = "c#",
|
||||||
generator = CSharpSecure_Gcg.generate,
|
name = "C# Cartridge",
|
||||||
parser = RepParser.readFile,
|
description = "",
|
||||||
template = "C#_SecureUML.tpl"},
|
recommended = true,
|
||||||
{name = dotNet,
|
generator = CSharp_Gcg.generate,
|
||||||
generator = CSharp_NET1_Gcg.generate,
|
parser = RepParser.readFile,
|
||||||
parser = RepParser.readFile,
|
template = "C#.tpl"},
|
||||||
template = "C#.pl"},
|
{lang = "c#_secure",
|
||||||
{name = dotNetSecure,
|
name = "C# SecureUML Cartridge",
|
||||||
generator = CSharpSecure_NET1_Gcg.generate,
|
description = "",
|
||||||
parser = RepParser.readFile,
|
recommended = true,
|
||||||
template = "C#_SecureUML.tpl"},
|
generator = CSharpSecure_Gcg.generate,
|
||||||
{name = cSharpSM,
|
parser = RepParser.readFile,
|
||||||
generator = CSharpSM_Gcg.generate,
|
template = "C#_SecureUML.tpl"},
|
||||||
parser = RepParser.readFile,
|
{lang = "c#_net1",
|
||||||
template = "C#_SM.tpl"},
|
name = "C# .NET1 Cartridge",
|
||||||
{name = java,
|
description = "",
|
||||||
generator = Java_Gcg.generate,
|
recommended = true,
|
||||||
parser = RepParser.readFile,
|
generator = CSharp_NET1_Gcg.generate,
|
||||||
template = "java.tpl"},
|
parser = RepParser.readFile,
|
||||||
{name = junit,
|
template = "C#.pl"},
|
||||||
generator = Junit_Gcg.generate,
|
{lang = "c#_net1_secure",
|
||||||
parser = RepParser.readFile,
|
name = "C# .NET1 SecureUML Cartridge",
|
||||||
template = "junit.tpl"},
|
description = "",
|
||||||
{name = javaocl,
|
recommended = true,
|
||||||
generator = Java_Ocl_Gcg.generate,
|
generator = CSharpSecure_NET1_Gcg.generate,
|
||||||
parser = RepParser.readFile,
|
parser = RepParser.readFile,
|
||||||
template = "java_ocl.tpl"},
|
template = "C#_SecureUML.tpl"},
|
||||||
{name = securemova,
|
{lang = "c#_sm",
|
||||||
generator = SecureMova_Gcg.generate,
|
name = "C# StateMachine Cartridge",
|
||||||
parser = RepParser.transformXMI o XmiParser.readFile,
|
description = "",
|
||||||
template = "securemova.tpl"}]
|
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 supported_languages = map #lang cartridge_list
|
||||||
|
val recommended_languages = map #lang (List.filter #recommended cartridge_list)
|
||||||
val string_of_languages = String.concatWith " | " supported_languages
|
val string_of_languages = String.concatWith " | " recommended_languages
|
||||||
|
|
||||||
fun is_supported lang = ListEq.includes supported_languages lang
|
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 =
|
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 <xmi_file> <language>\n"^
|
fun print_usage () = print ("usage: codegen <xmi_file> <language>\n"^
|
||||||
"\tlanguage = "^string_of_languages ^"\n")
|
"\tlanguage = "^string_of_languages ^"\n")
|
||||||
|
|
||||||
fun main (_,[xmi_file,lang]) = ((if is_supported lang
|
fun main (_,[xmi_file,lang]) = ((if is_supported lang
|
||||||
then generate xmi_file (parse_language lang)
|
then generate xmi_file lang
|
||||||
else print_usage ());
|
else print_usage ());
|
||||||
OS.Process.success)
|
OS.Process.success)
|
||||||
(* | main (_,[xmi_file,lang,template]) = (generate_with_template ; OS.Process.success) *)
|
(* | main (_,[xmi_file,lang,template]) = (generate_with_template ; OS.Process.success) *)
|
||||||
|
|
|
@ -34,14 +34,14 @@ open Rep_SecureUML_ComponentUML
|
||||||
|
|
||||||
(** capitalize the string s.
|
(** capitalize the string s.
|
||||||
* Returns the given string with the first letter changed to upper case
|
* 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
|
fun capitalize s = let val slist = String.explode s
|
||||||
in
|
in
|
||||||
String.implode (Char.toUpper (List.hd slist)::List.tl slist)
|
String.implode (Char.toUpper (List.hd slist)::List.tl slist)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(* can this be expressed more combinatorially? *)
|
||||||
fun deep_atpre (t as Literal _) = t
|
fun deep_atpre (t as Literal _) = t
|
||||||
| deep_atpre (t as CollectionLiteral _) = t
|
| deep_atpre (t as CollectionLiteral _) = t
|
||||||
| deep_atpre (t as If (cond,cond_type,then_term,then_type,
|
| deep_atpre (t as If (cond,cond_type,then_term,then_type,
|
||||||
|
|
|
@ -42,15 +42,14 @@ fun readFile filename =
|
||||||
(* how to do the following in a clean/portable way? *)
|
(* how to do the following in a clean/portable way? *)
|
||||||
fun read_dtd dtd =
|
fun read_dtd dtd =
|
||||||
(OS.FileSys.chDir (su4sml_home());
|
(OS.FileSys.chDir (su4sml_home());
|
||||||
(* dummy check to see if the file exists...*)
|
(* check to see if the DTD file exists. *)
|
||||||
OS.FileSys.fileSize "UML15OCL.xmi" ;
|
if OS.FileSys.access ("UML15OCL.xmi",[]) then
|
||||||
(Parser.parseDocument
|
(Parser.parseDocument
|
||||||
(SOME (Uri.String2Uri ("file:UML15OCL.xmi")))
|
(SOME (Uri.String2Uri ("file:UML15OCL.xmi")))
|
||||||
(SOME dtd) (dtd,nil,nil)
|
(SOME dtd) (dtd,nil,nil))
|
||||||
handle ex => (error_msg ("Error while reading file UML15OCL.xmi: "^
|
else error ("Error while reading file UML15OCL.xmi: "^
|
||||||
General.exnMessage ex);
|
"no such file or directory");
|
||||||
raise ex));
|
OS.FileSys.chDir currentDir)
|
||||||
OS.FileSys.chDir currentDir )
|
|
||||||
|
|
||||||
fun read_file dtd filename =
|
fun read_file dtd filename =
|
||||||
if filename = "-"
|
if filename = "-"
|
||||||
|
|
Loading…
Reference in New Issue