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
| 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 =
fn "base" => base
| "c#" => cSharp
@ -74,98 +76,99 @@ val parse_language =
| "javaocl" => javaocl
| "securemova" => securemova
val string_of_languages = "\"base\" \
\| \"c#\" \
\| \"c#sm\" \
\| \"c#_secure\" \
\| \"c#_net1\" \
\| \"c#_secure_net1\" \
\| \"c#sm\" \
\| \"java\" \
\| \"junit\" \
\| \"javaocl\" \
\| \"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 : string,
type cartridge = {name : language,
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",
val cartridge_list = [ {name = base,
generator = Base_Gcg.generate,
parser = RepParser.readFile,
template = "base.tpl"},
{name = "c#",
{name = cSharp,
generator = CSharp_Gcg.generate,
parser = RepParser.readFile,
template = "C#.tpl"},
{name = "c#_secure",
{name = cSharpSecure,
generator = CSharpSecure_Gcg.generate,
parser = RepParser.readFile,
template = "C#_SecureUML.tpl"},
{name = "c#_net1",
{name = dotNet,
generator = CSharp_NET1_Gcg.generate,
parser = RepParser.readFile,
template = "C#.pl"},
{name = "c#_secure_net1",
{name = dotNetSecure,
generator = CSharpSecure_NET1_Gcg.generate,
parser = RepParser.readFile,
template = "C#_SecureUML.tpl"},
{name = "c#sm",
{name = cSharpSM,
generator = CSharpSM_Gcg.generate,
parser = RepParser.readFile,
template = "C#_SM.tpl"},
{name = "java",
{name = java,
generator = Java_Gcg.generate,
parser = RepParser.readFile,
template = "java.tpl"},
{name = "junit",
{name = junit,
generator = Junit_Gcg.generate,
parser = RepParser.readFile,
template = "junit.tpl"},
{name = "javaocl",
{name = javaocl,
generator = Java_Ocl_Gcg.generate,
parser = RepParser.readFile,
template = "java_ocl.tpl"},
{name = "securemova",
{name = securemova,
generator = SecureMova_Gcg.generate,
parser = RepParser.transformXMI o XmiParser.readFile,
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 generate_from_model model (cart:cartridge) =
let val gen = #generator cart
fun generateFromModel model lang =
let val cart = cartridge_of lang
val gen = #generator (cartridge_of lang)
val template = "templates/"^(#template cart)
in
gen model template
end
fun generate xmi_file lang = let val cartridge = cartridge_of lang
val model = (#parser cartridge) xmi_file
in
generate_from_model model cartridge
end
fun generate xmi_file lang = generateFromModel ((#parser (cartridge_of lang)) xmi_file) lang
fun print_usage () = print ("usage: codegen <xmi_file> <language>\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)
(* | main (_,[xmi_file,lang,template]) = (generate_with_template ; OS.Process.success) *)
| main _ = (print_usage; OS.Process.success)
(* | main (_,[xmi_file,lang,template]) = (generate_with_template ; OS.Process.success) *)
| main _ = (print_usage(); OS.Process.success)
end
val _ = Codegen.main(CommandLine.name(),CommandLine.arguments())

View File

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