use an abstract datatype for codegen languages

git-svn-id: https://projects.brucker.ch/su4sml/svn/infsec-import/trunk/src/su4sml@6196 3260e6d1-4efc-4170-b0a7-36055960796d
This commit is contained in:
Jürgen Doser 2007-02-23 10:53:02 +00:00
parent 56473f35a0
commit ddfe7c84cd
2 changed files with 60 additions and 56 deletions

View File

@ -59,9 +59,11 @@ structure JavaSecure_Gcg = GCG_Core (Java_Cartridge(SecureUML_Cartridge(Base_Car
*) *)
datatype language = base | cSharp | cSharpSecure | dotNet | dotNetSecure datatype language = base | cSharp | cSharpSecure | dotNet | dotNetSecure
| cSharpSM | java | junit | javaocl | securemova | 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 = val parse_language =
fn "base" => base fn "base" => base
| "c#" => cSharp | "c#" => cSharp
@ -74,98 +76,99 @@ val parse_language =
| "javaocl" => javaocl | "javaocl" => javaocl
| "securemova" => securemova | "securemova" => securemova
val string_of_languages = "\"base\" \ val language_name =
\| \"c#\" \ fn base => "base"
\| \"c#sm\" \ | cSharp => "c#"
\| \"c#_secure\" \ | cSharpSecure => "c#_secure"
\| \"c#_net1\" \ | dotNet => "c#_net1"
\| \"c#_secure_net1\" \ | dotNetSecure => "c#_secure_net1"
\| \"c#sm\" \ | cSharpSM => "c#sm"
\| \"java\" \ | java => "java"
\| \"junit\" \ | junit => "junit"
\| \"javaocl\" \ | javaocl => "javaocl"
\| \"securemova\"" | securemova => "securemova"
(* maybe this should also hav a "description" field? *) (* maybe this should also hav a "description" field? *)
type cartridge = {name : string, type cartridge = {name : language,
generator: Rep.Model -> string -> unit, generator: Rep.Model -> string -> unit,
parser : string -> Rep.Model, parser : string -> Rep.Model,
template : string} 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", val cartridge_list = [ {name = base,
generator = Base_Gcg.generate, generator = Base_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "base.tpl"}, template = "base.tpl"},
{name = "c#", {name = cSharp,
generator = CSharp_Gcg.generate, generator = CSharp_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "C#.tpl"}, template = "C#.tpl"},
{name = "c#_secure", {name = cSharpSecure,
generator = CSharpSecure_Gcg.generate, generator = CSharpSecure_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "C#_SecureUML.tpl"}, template = "C#_SecureUML.tpl"},
{name = "c#_net1", {name = dotNet,
generator = CSharp_NET1_Gcg.generate, generator = CSharp_NET1_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "C#.pl"}, template = "C#.pl"},
{name = "c#_secure_net1", {name = dotNetSecure,
generator = CSharpSecure_NET1_Gcg.generate, generator = CSharpSecure_NET1_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "C#_SecureUML.tpl"}, template = "C#_SecureUML.tpl"},
{name = "c#sm", {name = cSharpSM,
generator = CSharpSM_Gcg.generate, generator = CSharpSM_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "C#_SM.tpl"}, template = "C#_SM.tpl"},
{name = "java", {name = java,
generator = Java_Gcg.generate, generator = Java_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "java.tpl"}, template = "java.tpl"},
{name = "junit", {name = junit,
generator = Junit_Gcg.generate, generator = Junit_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "junit.tpl"}, template = "junit.tpl"},
{name = "javaocl", {name = javaocl,
generator = Java_Ocl_Gcg.generate, generator = Java_Ocl_Gcg.generate,
parser = RepParser.readFile, parser = RepParser.readFile,
template = "java_ocl.tpl"}, template = "java_ocl.tpl"},
{name = "securemova", {name = securemova,
generator = SecureMova_Gcg.generate, generator = SecureMova_Gcg.generate,
parser = RepParser.transformXMI o XmiParser.readFile, parser = RepParser.transformXMI o XmiParser.readFile,
template = "securemova.tpl"}] template = "securemova.tpl"}]
val supported_languages = map #name cartridge_list val supported_languages = map (language_name o #name) cartridge_list
fun is_supported lang = ListEq.includes lang supported_languages val string_of_languages = String.concatWith " | " supported_languages
val string_of_languages = String.concatWith " | " (map (fn s => "\""^s^"\"") supported_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 => #name c = lang) cartridge_list)
fun generate_from_model model (cart:cartridge) = fun generateFromModel model lang =
let val gen = #generator cart let val cart = cartridge_of lang
val gen = #generator (cartridge_of lang)
val template = "templates/"^(#template cart) val template = "templates/"^(#template cart)
in in
gen model template gen model template
end end
fun generate xmi_file lang = let val cartridge = cartridge_of lang fun generate xmi_file lang = generateFromModel ((#parser (cartridge_of lang)) xmi_file) lang
val model = (#parser cartridge) xmi_file
in
generate_from_model model cartridge
end
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]) = (generate xmi_file lang ; fun main (_,[xmi_file,lang]) = ((if is_supported lang
then generate xmi_file (parse_language lang)
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) *)
| main _ = (print_usage; OS.Process.success) | main _ = (print_usage(); OS.Process.success)
end end
val _ = Codegen.main(CommandLine.name(),CommandLine.arguments()) val _ = Codegen.main(CommandLine.name(),CommandLine.arguments())

View File

@ -7,10 +7,10 @@ structure Design = SuperCart.Security.Design
open library open library
(* TODO: fill out *) (* TODO: fill out *)
type environment = { curPermissionList: SuperCart.Security.Permission list option, type environment = { curPermissionList : SuperCart.Security.Permission list option,
curPermission: SuperCart.Security.Permission option, curPermission : SuperCart.Security.Permission option,
curEntity: Rep.Classifier option, curEntity : Rep.Classifier option,
extension: SuperCart.environment} extension : SuperCart.environment}
type Model = SuperCart.Model type Model = SuperCart.Model
(* unpack : environment -> SuperCart.environment *) (* unpack : environment -> SuperCart.environment *)
@ -19,24 +19,23 @@ fun unpack (env : environment) = #extension env
(* pack : environment -> SuperCart.environment -> environment *) (* pack : environment -> SuperCart.environment -> environment *)
fun pack (env: environment) (new_env : SuperCart.environment) = fun pack (env: environment) (new_env : SuperCart.environment) =
{ curPermissionList = #curPermissionList env, { curPermissionList = #curPermissionList env,
curPermission = #curPermission env, curPermission = #curPermission env,
curEntity = #curEntity env, curEntity = #curEntity env,
extension = new_env} extension = new_env}
fun initEnv model = { curPermissionList = NONE, fun initEnv model = { curPermissionList = NONE,
curPermission = NONE, curPermission = NONE,
curEntity = NONE, curEntity = NONE,
extension = SuperCart.initEnv model} extension = SuperCart.initEnv model}
(* fun getModel (env : environment) = SuperCart.getModel (unpack env) *) (* fun getModel (env : environment) = SuperCart.getModel (unpack env) *)
fun curClassifier (env : environment) = SuperCart.curClassifier (unpack env) fun curClassifier (env:environment) = SuperCart.curClassifier (unpack env)
fun curAttribute (env : environment) = SuperCart.curAttribute (unpack env) fun curAttribute (env:environment) = SuperCart.curAttribute (unpack env)
fun curOperation (env : environment) = SuperCart.curOperation (unpack env) fun curOperation (env:environment) = SuperCart.curOperation (unpack env)
fun curArgument (env : environment) = SuperCart.curArgument (unpack env) fun curArgument (env:environment) = SuperCart.curArgument (unpack env)
fun curAssociationEnd env = SuperCart.curAssociationEnd (unpack env) fun curAssociationEnd (env:environment) = SuperCart.curAssociationEnd (unpack env)
fun curClassifier' (env:environment) = valOf (SuperCart.curClassifier (unpack env))
fun curClassifier' (env : environment) = valOf (SuperCart.curClassifier (unpack env))
(** (**
* compute the atomic actions that are possible on the currently "active" * compute the atomic actions that are possible on the currently "active"
@ -60,6 +59,8 @@ fun atomic_actions_from_context env =
(Option.valOf (curClassifier env))) (Option.valOf (curClassifier env)))
in [make_action "create", make_action "delete"] end in [make_action "create", make_action "delete"] end
else raise Fail "no current resource" else raise Fail "no current resource"
(* FIXME: i also need a function composite_actions_from_context *)
(* FIX *) (* FIX *)
fun permissions_for_action env act = fun permissions_for_action env act =