tests/syntax/identifier/identifier_as_function1.test
author Edouard Tisserant
Mon, 04 Oct 2021 11:29:13 +0200
changeset 1094 068c28266332
parent 108 f9e001952488
permissions -rwxr-xr-x
Remove RETAIN qualifier for F_TRIG and R_TRIG 'M' variable. This is not following standard, and implicitely consumes a lot of RETAIN memory. User can explicitely qualify R_TRIG of F_TRIG instance as RETAIN if needed.
(* Test whether the keyword XXXX may be used as an identifier for:
 * FUNCTION declaration
 *
 * The XXXX names in the following code are merely a placeholder.
 * They will be replaced by several identifiers before actual testing
 * of the compiler.
 *)

(* The identifiers that will replace the XXXX
 * must be placed on a line starting with #
 * All identifiers preceded by # are ignored!
 * The identifier list must be placed inside an IEC 61131-3 comment.
 *)
(* This file is specific for identifiers identical to IL operators.
 *  See the note following the identifier list
 *)
(*
#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
#SFC_qualifiers #D #DS #L #N #P #R #S #SD #SL
#Task_initialisers #PRIORITY #SINGLE #INTERVAL
*)

(* NOTE: The identifier as a function test has some special cases.
 *       Namely, when using IL operators as function names.
 *       For example, if a function LD has been previoulsy defined,
 *       The following IL code may be interpreted as either a 
 *       function call or an IL operation
 *         LD 10
 *       Due to undefined situations as the above, our 
 *       IEC compiler currently will always interpret IL operator identifiers.
 *       inside IL code as an IL operator.
 *       This means that calling, from IL code, of functions whose names
 *       coincide with an IL operator is not possible.
 *
 *       The following test code must therefore consider two possibilities:
 *        - if the identifier under test is an IL operator
 *        - if the identifier under test is not an IL operator
 *)





(* The FUNCTION declaration *)

function XXXX : int
 var_input
  a_1, b_1: int;
 end_var
  XXXX := a_1 + b_1;
end_function



(* Calling of the function from within ST code *)
function foo : int
 var
  c_1, d_1 : int;
  e_1, f_1 : int;
 end_var
  d_1 := XXXX(c_1, d_1);
  d_1 := XXXX(10, 20);
  c_1 := XXXX(20, 22);
  c_1 := XXXX(b_1 := e_1, a_1 := f_1);
  c_1 := XXXX (a_1 := e_1, b_1 := f_1);
end_function




(* Calling of the function from within IL code *)
(* NOTE: some legal identifiers, for ex. IL operators,
 * will not actually be interpreted as a reference to
 * the function, but rather as an IL operator.
 * However, no error should occur, as the compiler is written
 * to give priority to interpreting it as an IL operator.
 *)

(*
function bar000 : int
 var
  e_1, f_1 : int;
 end_var
  XXXX 10
  LD 20
  XXXX 30
  XXXX 10, 20
  XXXX (
    b_1 := 10,
    a_1 := 20
   )
  XXXX(
    b_1 := 10,
    a_1 := 20
   )
  XXXX (
    b_1 := 10
   )
  XXXX(
    b_1 := 10
   )
end_function
*)




(* Checking whether the use of XXXX will confuse the logic 
 * used to determine if a POU body is in IL or ST language.
 *)

(*
function bar001 : int
 var
  e_1, f_1 : int;
 end_var
  XXXX 10
end_function


function bar002 : int
 var
  e_1, f_1 : int;
 end_var
  XXXX 10, 20
end_function


function bar003 : int
 var
  e_1, f_1 : int;
 end_var
  XXXX(
    b_1 := 10,
    a_1 := 20
   )
end_function


function bar004 : int
 var
  e_1, f_1 : int;
 end_var
  XXXX (
    b_1 := 10,
    a_1 := 20
   )
end_function
*)









(* Checking whether the use of XXXX will confuse any other
 * normal and correct IL or ST code.
 *)
{#include "basic_code.test"}