diff -r 533741e5075c -r aee0a7eb833a plcopen/pou_variables.ysl2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plcopen/pou_variables.ysl2 Wed Oct 09 22:00:23 2013 +0200 @@ -0,0 +1,279 @@ +include yslt.yml2 +estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" + xmlns:xhtml="http://www.w3.org/1999/xhtml" + xmlns:ns="pou_vars_ns" + extension-element-prefixes="ns" + exclude-result-prefixes="ns" { + + template "text()"; + template "text()", mode="var_class"; + template "text()", mode="var_type"; + template "text()", mode="var_edit"; + template "text()", mode="var_debug"; + + variable "project" { + copy "document('project')/project/*"; + } + + variable "stdlib" { + copy "document('stdlib')/stdlib/*"; + } + variable "extensions" { + copy "document('extensions')/extensions/*"; + } + + function "add_root" { + param "class"; + param "type"; + param "edit" > true + param "debug" > true + value "ns:SetRoot($class, $type, $edit, $debug)"; + } + + template "ppx:pou" { + call "add_root" { + with "class" > «@pouType» + with "type" > «@name» + } + apply "ppx:interface"; + apply "ppx:actions/ppx:action | ppx:transitions/ppx:transition", mode="variable_list"; + } + + template "ppx:action" { + call "add_root" { + with "class" > action + } + apply "ancestor::ppx:pou/child::ppx:interface"; + } + + template "ppx:transition" { + call "add_root" { + with "class" > transition + } + apply "ancestor::ppx:pou/child::ppx:interface"; + } + + template "ppx:configuration" { + call "add_root" { + with "class" > configuration + with "debug" > false + } + apply "ppx:resource", mode="variable_list"; + apply "ppx:globalVars"; + } + + template "ppx:resource" { + call "add_root" { + with "class" > resource + with "debug" > false + } + apply "ppx:pouInstance | ppx:task/ppx:pouInstance", mode="variable_list"; + apply "ppx:globalVars"; + } + + function "variables_infos" { + param "var_class"; + foreach "ppx:variable" { + variable "class" { + apply "ppx:type", mode="var_class" { + with "default_class" > «$var_class» + } + } + variable "type" { + apply"ppx:type", mode="var_type"; + } + variable "edit" { + apply "ppx:type", mode="var_edit"; + } + variable "debug" { + apply "ppx:type", mode="var_debug"; + } + value "ns:AddVariable(@name, $class, $type, $edit, $debug)"; + } + } + + template "ppx:localVars" { + call "variables_infos" { + with "var_class" > Local + } + } + + template "ppx:globalVars" { + call "variables_infos" { + with "var_class" > Global + } + } + + template "ppx:externalVars" { + call "variables_infos" { + with "var_class" > External + } + } + + template "ppx:tempVars" { + call "variables_infos" { + with "var_class" > Temp + } + } + + template "ppx:inputVars" { + call "variables_infos" { + with "var_class" > Input + } + } + + template "ppx:outputVars" { + call "variables_infos" { + with "var_class" > Output + } + } + + template "ppx:inOutVars" { + call "variables_infos" { + with "var_class" > InOut + } + } + + function "add_variable" { + param "name"; + param "class"; + param "type"; + param "edit" > true + param "debug" > true + value "ns:AddVariable($name, $class, $type, $edit, $debug)"; + } + + template "ppx:action", mode="variable_list" { + call "add_variable" { + with "name" > «@name» + with "class" > action + } + } + + template "ppx:transition", mode="variable_list" { + call "add_variable" { + with "name" > «@name» + with "class" > transition + } + } + + template "ppx:resource", mode="variable_list" { + call "add_variable" { + with "name" > «@name» + with "class" > resource + with "debug" > false + } + } + + template "ppx:pouInstance", mode="variable_list" { + call "add_variable" { + with "name" > «@name» + with "class" > program + with "type" > «@typeName» + } + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_class" { + param "default_class"; + variable "type_name", "@name"; + variable "pou_infos" { + copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | + exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | + exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]"""; + } + choose { + when "$pou_infos != ''" { + apply "exsl:node-set($pou_infos)", mode="var_class"; + } + otherwise { + value "$default_class" + } + } + } + + template "ppx:pou", mode="var_class" { + value "@pouType"; + } + + template "*[self::ppx:type or self::ppx:baseType]/*" mode="var_class" { + param "default_class"; + value "$default_class"; + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_type" { + > «@name» + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_type" { + > ARRAY [ + foreach "ppx:dimension" { + > «@lower»..«@upper» + } + > ] OF + apply "ppx:baseType", mode="var_type"; + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:string", mode="var_type" { + > STRING + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:wstring", mode="var_type" { + > WSTRING + } + + template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_type" { + > «local-name()» + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_edit" { + variable "type_name", "@name"; + variable "pou_infos" { + copy "exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]"; + } + choose { + when "$pou_infos != ''" > true + otherwise > false + } + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_edit" { + apply "ppx:baseType", mode="var_edit"; + } + + template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_edit" { + > false + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_debug" { + variable "type_name", "@name"; + variable "datatype_infos" { + copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | + exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] | + exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] | + exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]"""; + } + choose { + when "$datatype_infos != ''" { + apply "exsl:node-set($datatype_infos)", mode="var_debug"; + } + otherwise > false + } + } + + template "ppx:pou", mode="var_debug" { + > true + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_debug" { + > false + } + + template "*[self::ppx:type or self::ppx:baseType]/ppx:struct", mode="var_debug" { + > false + } + + template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_debug" { + > true + } + +}