mario@108: (* Test whether the keyword XXXX may be used as an identifier for:
mario@108:  * FUNCTION declaration
mario@108:  *
mario@108:  * The XXXX names in the following code are merely a placeholder.
mario@108:  * They will be replaced by several identifiers before actual testing
mario@108:  * of the compiler.
mario@108:  *)
mario@108: 
mario@108: (* The identifiers that will replace the XXXX
mario@108:  * must be placed on a line starting with #
mario@108:  * All identifiers preceded by # are ignored!
mario@108:  * The identifier list must be placed inside an IEC 61131-3 comment.
mario@108:  *)
mario@108: (* This file is specific for identifiers identical to IL operators.
mario@108:  *  See the note following the identifier list
mario@108:  *)
mario@108: (*
mario@108: #IL_operators ANDN CAL CALC CALCN CD CLK CU IN JMP JMPC JMPCN LD LDN ORN PT PV R R1 RET RETC RETCN S S1 ST STN XORN
mario@108: #SFC_qualifiers #D #DS #L #N #P #R #S #SD #SL
mario@108: #Task_initialisers #PRIORITY #SINGLE #INTERVAL
mario@108: *)
mario@108: 
mario@108: (* NOTE: The identifier as a function test has some special cases.
mario@108:  *       Namely, when using IL operators as function names.
mario@108:  *       For example, if a function LD has been previoulsy defined,
mario@108:  *       The following IL code may be interpreted as either a 
mario@108:  *       function call or an IL operation
mario@108:  *         LD 10
mario@108:  *       Due to undefined situations as the above, our 
mario@108:  *       IEC compiler currently will always interpret IL operator identifiers.
mario@108:  *       inside IL code as an IL operator.
mario@108:  *       This means that calling, from IL code, of functions whose names
mario@108:  *       coincide with an IL operator is not possible.
mario@108:  *
mario@108:  *       The following test code must therefore consider two possibilities:
mario@108:  *        - if the identifier under test is an IL operator
mario@108:  *        - if the identifier under test is not an IL operator
mario@108:  *)
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: (* The FUNCTION declaration *)
mario@108: 
mario@108: function XXXX : int
mario@108:  var_input
mario@108:   a_1, b_1: int;
mario@108:  end_var
mario@108:   XXXX := a_1 + b_1;
mario@108: end_function
mario@108: 
mario@108: 
mario@108: 
mario@108: (* Calling of the function from within ST code *)
mario@108: function foo : int
mario@108:  var
mario@108:   c_1, d_1 : int;
mario@108:   e_1, f_1 : int;
mario@108:  end_var
mario@108:   d_1 := XXXX(c_1, d_1);
mario@108:   d_1 := XXXX(10, 20);
mario@108:   c_1 := XXXX(20, 22);
mario@108:   c_1 := XXXX(b_1 := e_1, a_1 := f_1);
mario@108:   c_1 := XXXX (a_1 := e_1, b_1 := f_1);
mario@108: end_function
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: (* Calling of the function from within IL code *)
mario@108: (* NOTE: some legal identifiers, for ex. IL operators,
mario@108:  * will not actually be interpreted as a reference to
mario@108:  * the function, but rather as an IL operator.
mario@108:  * However, no error should occur, as the compiler is written
mario@108:  * to give priority to interpreting it as an IL operator.
mario@108:  *)
mario@108: 
mario@108: (*
mario@108: function bar000 : int
mario@108:  var
mario@108:   e_1, f_1 : int;
mario@108:  end_var
mario@108:   XXXX 10
mario@108:   LD 20
mario@108:   XXXX 30
mario@108:   XXXX 10, 20
mario@108:   XXXX (
mario@108:     b_1 := 10,
mario@108:     a_1 := 20
mario@108:    )
mario@108:   XXXX(
mario@108:     b_1 := 10,
mario@108:     a_1 := 20
mario@108:    )
mario@108:   XXXX (
mario@108:     b_1 := 10
mario@108:    )
mario@108:   XXXX(
mario@108:     b_1 := 10
mario@108:    )
mario@108: end_function
mario@108: *)
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: (* Checking whether the use of XXXX will confuse the logic 
mario@108:  * used to determine if a POU body is in IL or ST language.
mario@108:  *)
mario@108: 
mario@108: (*
mario@108: function bar001 : int
mario@108:  var
mario@108:   e_1, f_1 : int;
mario@108:  end_var
mario@108:   XXXX 10
mario@108: end_function
mario@108: 
mario@108: 
mario@108: function bar002 : int
mario@108:  var
mario@108:   e_1, f_1 : int;
mario@108:  end_var
mario@108:   XXXX 10, 20
mario@108: end_function
mario@108: 
mario@108: 
mario@108: function bar003 : int
mario@108:  var
mario@108:   e_1, f_1 : int;
mario@108:  end_var
mario@108:   XXXX(
mario@108:     b_1 := 10,
mario@108:     a_1 := 20
mario@108:    )
mario@108: end_function
mario@108: 
mario@108: 
mario@108: function bar004 : int
mario@108:  var
mario@108:   e_1, f_1 : int;
mario@108:  end_var
mario@108:   XXXX (
mario@108:     b_1 := 10,
mario@108:     a_1 := 20
mario@108:    )
mario@108: end_function
mario@108: *)
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: 
mario@108: (* Checking whether the use of XXXX will confuse any other
mario@108:  * normal and correct IL or ST code.
mario@108:  *)
mario@108: {#include "basic_code.test"}
mario@108: 
mario@108: