plcopen/variables_infos.ysl2
changeset 1347 533741e5075c
child 1359 cce13b237b07
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/variables_infos.ysl2	Wed Oct 09 10:57:20 2013 +0200
@@ -0,0 +1,233 @@
+include yslt.yml2
+estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
+            xmlns:xhtml="http://www.w3.org/1999/xhtml"
+            xmlns:ns="var_infos_ns" 
+            extension-element-prefixes="ns" 
+            exclude-result-prefixes="ns" {
+    
+    param "tree";
+    
+    template "text()";
+    
+    variable "project" {
+        choose {
+            when "$tree='True'" {
+                copy "document('project')/project/*";
+            }
+        }
+    }
+    
+    variable "stdlib" {
+        choose {
+            when "$tree='True'" {
+                copy "document('stdlib')/stdlib/*";
+            }
+        }
+    }
+    variable "extensions" {
+        choose {
+            when "$tree='True'" {
+                copy "document('extensions')/extensions/*";
+            }
+        }
+    }
+    
+    template "ppx:returnType" {
+        value "ns:AddTree()";
+        apply;
+    }
+    
+    function "variables_infos" {
+        param "var_class";
+        variable "var_option" {
+            choose {
+                when "@constant='true' or @constant='1'" > Constant
+                when "@retain='true' or @retain='1'" > Retain
+                when "@nonretain='true' or @nonretain='1'" > Non-Retain
+            }
+        }
+        foreach "ppx:variable" {
+            variable "initial_value" {
+                apply "ppx:initialValue";
+            }
+            variable "edit" {
+                choose {
+                    when "$var_class='Global' or $var_class='External'" > true
+                    otherwise {
+                        apply "ppx:type", mode="var_edit";
+                    }
+                }
+            }
+            value "ns:AddTree()";
+            apply "ppx:type";
+            value "ns:AddVariable(@name, $var_class, $var_option, @address, $initial_value, $edit, ppx:documentation/xhtml:p/text())";
+        }
+    }
+    
+    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
+        }
+    }
+    
+    template "ppx:pou" {
+        apply "ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars or self::ppx:outputVars]/ppx:variable";
+    }
+    
+    template "ppx:variable" {
+        variable "name" > «@name»
+        value "ns:AddTree($name)";
+        apply "ppx:type";
+        value "ns:AddVarToTree($name)";
+    }
+    
+    template "ppx:dataType" {
+        apply "ppx:baseType";
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:struct" {
+        apply "ppx:variable";
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived" {
+        variable "type_name" > «@name»
+        choose {
+            when "$tree='True'" {
+                apply """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:pous/ppx:pou[@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:pous/ppx:pou[@name=$type_name] |
+                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""";
+            }
+        }
+        value "ns:SetType($type_name)";
+    }
+     
+    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:array" {
+        apply "ppx:baseType";
+        foreach "ppx:dimension" {
+            value "ns:AddDimension(@lower, @upper)";
+        }
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string" {
+        variable "name" > STRING
+        value "ns:SetType($name)";
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring" {
+        variable "name" > WSTRING
+        value "ns:SetType($name)";
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*" {
+        variable "name" > «local-name()»
+        value "ns:SetType($name)";
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/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] |
+                    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 != ''" > false
+            otherwise > true
+        }
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*", mode="var_edit" {
+        > true
+    }
+    
+    template "ppx:value" {
+        choose {
+            when "@repetitionValue" {
+                > «@repetitionValue»(
+                apply;
+                > )
+            }
+            when "@member" {
+                 > «@member» := 
+                 apply;
+            }
+            otherwise {
+                apply;
+            }
+        }
+    }
+    
+    template "ppx:simpleValue" {
+        > «@value»
+    }
+    
+    function "complex_type_value" {
+        param "start_bracket";
+        param "end_bracket";
+        > «@start_bracket»
+        foreach "ppx:value" {
+            apply ".";
+            choose {
+                when "position()!=last()" > , 
+            }
+        }
+        > «@end_bracket»
+    }
+    
+    template "ppx:arrayValue" {
+        call "complex_type_value" {
+            with "start_bracket" > [
+            with "end_bracket" > ]
+        }
+    }
+    
+    template "ppx:structValue" {
+        call "complex_type_value" {
+            with "start_bracket" > (
+            with "end_bracket" > )
+        }
+    }
+
+}
+
+    
+    
\ No newline at end of file