Regression tests. Test correct parsing of identifiers.
authormario
Sat, 09 Feb 2008 08:57:14 +0100
changeset 108 f9e001952488
parent 107 ff5c92df0c78
child 109 3af0b849b9c6
Regression tests. Test correct parsing of identifiers.
tests/syntax/identifier/Makefile
tests/syntax/identifier/basic_code.test
tests/syntax/identifier/identifier.txt
tests/syntax/identifier/identifier_as_configuration.test
tests/syntax/identifier/identifier_as_datatype.test
tests/syntax/identifier/identifier_as_enumerationvalue.test
tests/syntax/identifier/identifier_as_function1.test
tests/syntax/identifier/identifier_as_function2.test
tests/syntax/identifier/identifier_as_functionblock.test
tests/syntax/identifier/identifier_as_label.test
tests/syntax/identifier/identifier_as_program.test
tests/syntax/identifier/identifier_as_variable1.test
tests/syntax/identifier/identifier_as_variable2.test
tests/syntax/identifier/identifier_in_sfc.test
tests/syntax/identifier/runtests
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/Makefile	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,15 @@
+
+
+default: runtests
+
+
+runtests:
+	./runtests
+
+
+clean:
+	rm -f *.iec
+	rm -f *.err
+	rm -f *.err2
+	rm -f *.out
+	rm -f *.out2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/basic_code.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,685 @@
+(* This file includes normal standard ST and IL code.
+ * This code is then included into other tests, once
+ * possibly strange things have been defined.
+ *
+ * Including this normal code will test whether the strange
+ * things somehow breack the correct parsing and compiling
+ * of normal code.
+ *
+ * Code in this file must not use the XXXX identfier!
+ *)
+
+
+
+(***************************************************************************)
+(* Test if generic IL code is not affected by any previous declarations... *)
+(***************************************************************************)
+
+
+(* Test each IL operator *)
+(* Since our compiler needs to distinguish
+ * between IL and ST code, we place each IL
+ * operator in a distinct function, to test whether
+ * the use of that IL operator as the first IL
+ * instruction does not confuse the logic
+ * use to determine whether ST or IL is being parsed.
+ *)
+
+function bar0005 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ & 10
+end_function
+
+
+
+function bar0006 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ &N 10
+end_function
+
+
+
+function bar0007 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ ADD 10
+end_function
+
+
+
+function bar0008 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ AND TRUE
+end_function
+
+
+function bar0009 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ ANDN TRUE
+end_function
+
+
+function_block bar0010
+ var
+  e_1, f_1 : int;
+  tt : TP;
+ end_var
+ CAL tt
+end_function_block
+
+
+function_block bar0011
+ var
+  e_1, f_1 : int;
+  tt : TP;
+ end_var
+ CALC tt
+end_function_block
+
+
+function_block bar0012
+ var
+  e_1, f_1 : int;
+  tt : TP;
+ end_var
+ CALCN tt
+end_function_block
+
+
+function_block bar0013
+ var
+  e_1, f_1 : int;
+  tt : CTUD;
+ end_var
+ CU tt
+end_function_block
+
+
+function_block bar0014
+ var
+  e_1, f_1 : int;
+  tt : CTUD;
+ end_var
+ CD tt
+end_function_block
+
+
+function_block bar0015
+ var
+  e_1, f_1 : int;
+  tt : R_TRIG;
+ end_var
+ CLK tt
+end_function_block
+
+
+function bar0016 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ DIV e_1
+end_function
+
+
+function bar0017 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ EQ e_1
+end_function
+
+
+function bar0018 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ GE e_1
+end_function
+
+
+function bar0019 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ GT e_1
+end_function
+
+
+function_block bar0020
+ var
+  e_1, f_1 : int;
+  tt : TP;
+ end_var
+ IN tt
+end_function_block
+
+
+function bar0021 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ JMP ll
+ ll: LD FALSE
+end_function
+
+
+
+function bar0022 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ JMPC ll
+ ll: LD FALSE
+end_function
+
+
+function bar0023 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ JMPCN ll
+ ll: LD FALSE
+end_function
+
+
+
+function bar0024 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ LD TRUE
+end_function
+
+
+function bar0025 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ LDN TRUE
+end_function
+
+
+function bar0026 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ LE e_1
+end_function
+
+
+function bar0027 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ LT e_1
+end_function
+
+
+function bar0028 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ MOD e_1
+end_function
+
+
+function bar0029 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ MUL e_1
+end_function
+
+
+function bar0030 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ NE e_1
+end_function
+
+
+function bar0031 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ NOT TRUE
+end_function
+
+
+function bar0032 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ OR TRUE
+end_function
+
+
+function bar0033 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ ORN TRUE
+end_function
+
+
+function_block bar0034
+ var
+  e_1, f_1 : int;
+  tt : TP;
+ end_var
+ PT tt
+end_function_block
+
+
+function_block bar0035
+ var
+  e_1, f_1 : int;
+  tt : CTUD;
+ end_var
+ PV tt
+end_function_block
+
+
+function bar0036 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ R e_1     (* IL operand *)
+end_function
+
+
+function_block bar0037
+ var
+  e_1, f_1 : int;
+  tt : SR;
+ end_var
+ R tt     (* FB call *)
+end_function_block
+
+
+function_block bar0038
+ var
+  e_1, f_1 : int;
+  tt : SR;
+ end_var
+ R1 tt     (* FB call *)
+end_function_block
+
+
+function bar0039 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ RET
+end_function
+
+
+function bar0040 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ RETC
+end_function
+
+
+function bar0041 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ RETCN
+end_function
+
+
+function bar0042 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ S e_1
+end_function
+
+
+function_block bar0043
+ var
+  e_1, f_1 : int;
+  tt : SR;
+ end_var
+ S1 tt     (* FB call *)
+end_function_block
+
+
+function bar0044 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ ST e_1
+end_function
+
+
+function bar0045 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ STN e_1
+end_function
+
+
+function bar0046 : int
+ var
+  e_1, f_1 : int;
+ end_var
+ SUB e_1
+end_function
+
+
+function bar0047 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ XOR e_1
+end_function
+
+
+function bar0048 : int
+ var
+  e_1, f_1 : bool;
+ end_var
+ XORN e_1
+end_function
+
+
+
+
+
+
+
+
+
+(***************************************************************************)
+(* Test if generic ST code is not affected by any previous declarations... *)
+(***************************************************************************)
+
+(* A helper FUNCTION BLOCK declaration *)
+function_block bar1000
+ var_input
+  a_1, b_1: int;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10 + b_1;
+end_function_block
+
+
+(* A FUNCTION declaration *)
+function bar1001 : int
+ var_input
+  a_1, b_1: int;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10 + b_1;
+end_function
+
+
+(* Generic ST code *)
+
+function_block bar1002
+ var
+  e_1, f_1 : int;
+  g_1 : int;
+  fb : bar1000;
+ end_var
+  fb(g_1, 20);
+  fb (10, g_1, e_1, f_1);
+  fb (a_1 := g_1, b_1:=g_1, c_1=>g_1, d_1=>f_1);
+  fb(a_1 := 10, b_1:=20, c_1=>e_1, d_1=>g_1);
+  fb (c_1=>g_1, a_1:=20, d_1=>f_1);
+  g_1 := fb.c_1;
+  fb.a_1 := g_1 + g_1 * 2 * (g_1) / bar1001(g_1, 10, g_1, e_1) MOD g_1 MOD g_1 ** g_1;
+  IF (g_1 >= 10) THEN g_1 := 10; END_IF;
+  CASE (g_1 + 10) OF
+    10: g_1 := 10; 
+    10..20:g_1 := 20;
+    ELSE g_1 := 20;
+  END_CASE;
+  FOR g_1 := 10 TO 20 BY 2 DO
+    g_1 := g_1 + 1;
+  END_FOR;
+  FOR e_1 := g_1 TO 20 DO
+    g_1 := g_1 + 1;
+  END_FOR;
+  FOR e_1 := 10 TO g_1 BY 2 DO
+    g_1 := g_1 + 1;
+  END_FOR;
+  FOR e_1 := 10 TO g_1 DO
+    g_1 := g_1 + 1;
+  END_FOR;
+  FOR e_1 := 10 TO 20 BY g_1 DO
+    g_1 := g_1 + 1;
+  END_FOR;
+  WHILE (g_1 >= 10) DO 
+    g_1 := 10; 
+  END_WHILE;
+  REPEAT g_1 := 10; UNTIL (g_1 >= 10) END_REPEAT;
+end_function_block
+
+
+
+
+
+
+
+
+
+
+(****************************************************************************)
+(* Test if generic SFC code is not affected by any previous declarations... *)
+(****************************************************************************)
+
+PROGRAM bar2001
+  VAR
+    QX1 AT %QX1 : BOOL := 1;
+    QX2 AT %QX2 : BOOL := 0;
+    QX3 AT %QX3 : BOOL;
+    IX1 AT %IX1 : BOOL;
+    IX2 AT %IX2 : BOOL;
+    IX3 AT %IX3 : BOOL;
+  END_VAR
+  VAR
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  STEP STEP1:
+    ONSTEP1();
+  END_STEP
+
+  ACTION ONSTEP1:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+
+  TRANSITION (PRIORITY := 4) FROM STEP1 TO STEP2
+    := IX2 = TRUE;
+  END_TRANSITION
+
+  STEP STEP2:
+    INLINE1(D, T#1s);
+  END_STEP
+
+  ACTION INLINE1:
+    QX1 := QX2 XOR QX1; QX2 := NOT QX2;
+  END_ACTION
+
+  TRANSITION transition_id1 FROM STEP2 TO A1
+    := QX1 = FALSE AND QX2 = FALSE;
+  END_TRANSITION
+
+  STEP A1:
+    INLINE2(DS, T#1s);
+  END_STEP
+
+  ACTION INLINE2:
+    IX1 := TRUE;
+  END_ACTION
+
+  TRANSITION transition_id2 (PRIORITY := 3) FROM A1 TO STEP2
+    := IX1 = TRUE;
+  END_TRANSITION
+
+  TRANSITION FROM STEP2 TO (D1, D2, D3)
+    := QX1 = TRUE AND QX2 = TRUE;
+  END_TRANSITION
+
+  STEP D1:
+    INLINE5(L, T#1s);
+  END_STEP
+
+  ACTION INLINE5:
+    QX1 := FALSE;
+  END_ACTION
+
+  TRANSITION FROM D1 TO E1
+    := NOT ( QX1 OR QX2 OR QX3 );
+  END_TRANSITION
+
+  STEP E1:
+    INLINE8(N);
+  END_STEP
+
+  ACTION INLINE8:
+    QX1 := TRUE;
+  END_ACTION
+
+  TRANSITION FROM (E1, E2, E3) TO GO
+    := QX1 AND QX2 AND QX3;
+  END_TRANSITION
+
+  STEP D2:
+    INLINE6(P);
+  END_STEP
+
+  ACTION INLINE6:
+    QX2 := FALSE;
+  END_ACTION
+
+  TRANSITION FROM D2 TO E2
+    := NOT ( QX1 OR QX2 OR QX3 );
+  END_TRANSITION
+
+  STEP E2:
+    INLINE9(R);
+  END_STEP
+
+  ACTION INLINE9:
+    QX2 := TRUE;
+  END_ACTION
+
+  STEP D3:
+    INLINE7(S);
+  END_STEP
+
+  ACTION INLINE7:
+    QX2 := FALSE;
+  END_ACTION
+
+  TRANSITION FROM D3 TO E3
+    := NOT ( QX1 OR QX2 OR QX3 );
+  END_TRANSITION
+
+  STEP E3:
+    INLINE10(SD, T#1s);
+  END_STEP
+
+  ACTION INLINE10:
+    QX3 := TRUE;
+  END_ACTION
+
+  TRANSITION FROM STEP2 TO A3
+    := QX1 = TRUE AND QX2 = FALSE;
+  END_TRANSITION
+
+  STEP A3:
+    INLINE4(SL, T#1s);
+  END_STEP
+
+  ACTION INLINE4:
+    IX1 := TRUE;
+  END_ACTION
+
+  TRANSITION FROM A3 TO STEP2
+    := IX1 = TRUE;
+  END_TRANSITION
+
+  TRANSITION FROM STEP2 TO A2
+    := QX1 = FALSE AND QX2 = TRUE;
+  END_TRANSITION
+
+  STEP A2:
+    INLINE3(L, delta_1);
+  END_STEP
+
+  ACTION INLINE3:
+    IX1 := FALSE;
+  END_ACTION
+
+  TRANSITION FROM A2 TO STEP2
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  STEP A01:
+    INLINE01(L, delta_1, IX1, QX1);
+  END_STEP
+
+  ACTION INLINE01:
+    IX1 := FALSE;
+  END_ACTION
+
+  TRANSITION FROM STEP2 TO A01
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  STEP A02:
+    INLINE01(L, delta_1, IX1, QX1);
+    INLINE1 (L, delta_1, IX1, QX1);
+    INLINE2 (S);
+    INLINE3 ();
+  END_STEP
+
+  TRANSITION FROM STEP2 TO A02
+    := IX1 = FALSE;
+  END_TRANSITION
+END_PROGRAM
+
+
+
+
+
+
+(*********************************************************************************)
+(* Test if generic CONFIGURATION is not affected by any previous declarations... *)
+(*********************************************************************************)
+
+CONFIGURATION CONF0001
+  RESOURCE STD_RESSOURCE ON BEREMIZ
+    TASK STD_TASK(INTERVAL := t#100ms,PRIORITY := 0);
+    PROGRAM MAIN_INSTANCE : bar2001;
+  END_RESOURCE
+END_CONFIGURATION
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier.txt	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,57 @@
+################
+# IL operators #
+################
+# which are not simultaneously 
+#    - keywords (AND, OR, NOT, MOD, XOR), 
+#    - or standard funtion name (which by implication are also keywords)
+#               (AND, OR, NOT, MOD, XOR, as well as, GE, GT, LE, LT, EQ, NE, SUB, ADD, MUL, DIV) 
+#    - or standard function block name (which by implication are also keywords)
+#    - invalid identifier name (&, &N)
+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  -> also an IL operator
+#S  -> also an IL operator
+SD
+SL
+
+
+#####################
+# Task initialisers #
+#####################
+PRIORITY
+SINGLE
+INTERVAL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_configuration.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,48 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * CONFIGURATION identifier
+ *
+ * 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.
+ *)
+(*
+#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
+     NOTE: R and S are identical to IL operators!!
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+
+
+(* a helper program *)
+PROGRAM bar000
+VAR_INPUT
+  a_1 : BOOL;
+END_VAR
+VAR_OUTPUT
+  b_1 : BOOL;
+END_VAR
+  a_1 := TRUE;
+END_PROGRAM
+
+
+ (* using in program parameter *)
+CONFIGURATION XXXX
+ TASK fast(PRIORITY := 4);
+ PROGRAM foo WITH fast:
+       bar000(a_1 := TRUE);
+END_CONFIGURATION
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_datatype.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,46 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * derived data type identifier
+ *
+ * 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.
+ *)
+(*
+#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
+     NOTE: R and S are identical to IL operators!!
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+
+
+
+TYPE
+ XXXX : real := 50;
+END_TYPE
+
+
+
+function foo : int
+ var_input
+  a_1, b_1: XXXX;
+ end_var
+ var
+  c_1, d_1: int;
+ end_var
+  c_1 := 0;
+end_function
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_enumerationvalue.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,60 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * enumeration value
+ *
+ * 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.
+ *)
+(*
+#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
+     NOTE: R and S are identical to IL operators!!
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+
+
+
+TYPE
+ enum_type00 : (enum_v1, XXXX, enum_v2) := XXXX;
+END_TYPE
+
+TYPE
+ enum_type01 : (XXXX, enum_v2) := XXXX;
+END_TYPE
+
+TYPE
+ enum_type02 : (enum_v1, XXXX) := XXXX;
+END_TYPE
+
+TYPE
+ enum_type03 : (XXXX) := XXXX;
+END_TYPE
+
+
+
+
+function foo : int
+ var_input
+  a_1, b_1: int;
+ end_var
+ var
+  c_1, d_1: enum_type00;
+ end_var
+  c_1 := enum_type00#XXXX;
+  c_1 := XXXX;
+end_function
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_function1.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,164 @@
+(* 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"}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_function2.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,149 @@
+(* 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 NOT 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 
+#IL_operators #PT #PV #R #R1 #RET #RETC #RETCN #S #S1 #ST #STN #XORN
+     NOTE: R and S are identical to IL operators!!
+#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 *)
+
+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" }
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_functionblock.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,103 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * FUNCTION_BLOCK 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.
+ *)
+(*
+#IL_operators ANDN CAL CALC CALCN CD CLK CU IN JMP JMPC JMPCN LD LDN ORN 
+#IL_operators PT PV R R1 RET RETC RETCN S S1 ST STN XORN
+     NOTE: R and S are identical to IL operators!!
+#SFC_qualifiers D DS L N P #R #S SD SL   
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+
+
+
+
+(* The FUNCTION BLOCK declaration *)
+function_block XXXX
+ var_input
+  a_1, b_1: int;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10 + b_1;
+end_function_block
+
+
+(* Calling of the function block from within ST code *)
+
+function_block foo
+ var
+  e_1, f_1 : int;
+  fb : XXXX;
+ end_var
+  fb(10, 20);
+  fb (10, 20, e_1, f_1);
+  fb (a_1 := 10, b_1:=20, c_1=>e_1, d_1=>f_1);
+  fb(a_1 := 10, b_1:=20, c_1=>e_1, d_1=>f_1);
+  fb (c_1=>e_1, a_1:=20, d_1=>f_1);
+  f_1 := fb.c_1;
+  fb.a_1 := e_1;
+end_function_block
+
+
+
+(* Calling of the function block from within IL code *)
+function_block bar
+ var
+  e_1, f_1 : int;
+  fb : XXXX;
+ end_var
+  CAL fb
+  LD fb.a_1
+  ST fb.b_1
+  CAL fb (10)
+  CAL fb(30, 20, e_1, f_1)
+  CAL fb (
+    a_1 := 10,
+    c_1 => f_1
+   )
+  CAL fb(
+    a_1 := 10,
+    c_1 => f_1
+   )
+end_function_block
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
+
+
+
+
+
+
+
+
+(*
+
+CONFIGURATION
+......
+using these XXXX identifiers within a configuration
+
+especially a task initialisation, as Priority, single and interval may clash here.
+(they shouldn't, but if the parser has an error, they will....)
+
+END_CONFIGURATION
+
+*)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_label.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,65 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * IL label name/identifier
+ *
+ * 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.
+ *)
+(*
+#IL_operators #ANDN #CAL #CALC #CALCN #CD #CLK #CU #IN #JMP #JMPC #JMPCN 
+#IL_operators #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
+     NOTE: R and S are identical to IL operators!!
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+(* NOTE: Currently the matiec compiler does not yet support
+ *       the use of identifiers identical to IL operators
+ *       in IL code. In ther words, in IL code we cannot use 
+ *       identifiers identical to IL operators to identify variables,
+ *       functions, etc...
+ *       Identifiers identical to IL operators are therefore
+ *       commented out.
+ *)
+
+
+
+
+
+function foo : int
+ var
+  e, f : bool;
+ end_var
+
+ XXXX: R e
+  JMP XXXX
+end_function
+
+
+
+function bar : int
+ var
+  e, f : bool;
+ end_var
+
+  JMP XXXX
+ XXXX: R e
+end_function
+
+
+
+
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_program.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,66 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * Program identifier
+ *
+ * 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
+     NOTE: R and S are identical to IL operators!!
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+(* NOTE: The identifier as a variable test has some special cases.
+ *       Namely, when using IL operators as variable names.
+ *       Even though the syntax of the IL language would not result
+ *       in ambiguities in the above case, our parser does not currently
+ *       allow the use of variables (with names identical to IL
+ *       operators) within IL code.
+ *
+ *       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
+ *)
+
+
+
+
+
+
+PROGRAM XXXX
+VAR_INPUT
+  a_1 : BOOL;
+END_VAR
+  LD a_1
+END_PROGRAM
+
+
+
+
+
+CONFIGURATION config1
+ TASK fast(PRIORITY := 4);
+ PROGRAM P1 WITH fast:
+       XXXX(a_1 := TRUE);
+END_CONFIGURATION
+
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_variable1.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,389 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * variable name/identifier
+ *
+ * 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.
+ *)
+(*
+#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
+     NOTE: R and S are identical to IL operators!!
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+(* NOTE: The identifier as a variable test has some special cases.
+ *       Namely, when using IL operators as variable names.
+ *       Even though the syntax of the IL language would not result
+ *       in ambiguities in the above case, our parser does not currently
+ *       allow the use of variables (with names identical to IL
+ *       operators) within IL code.
+ *
+ *       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 test code in this file should be valid for all identifiers.
+ *       Test code that is only valid for identifiers not identical to IL operators 
+ *        is placed in another test file (identifier_as_variable2.test).
+ *)
+
+
+
+
+(* A helper FUNCTION BLOCK declaration *)
+function_block foo_fb
+ var_input
+  a_1, b_1: int;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10 + b_1;
+end_function_block
+
+
+(* A helper FUNCTION declaration *)
+function foo_f1 : int
+ var_input
+  a_1, b_1: int;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10 + b_1;
+end_function
+
+(* Another helper FUNCTION declaration *)
+function foo_f2 : int
+ var_input
+  a_1, b_1: foo_fb;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10;
+end_function
+
+
+
+(*********************************************************************)
+(* Testing use of XXXX in several locations of variable declarations *)
+(*********************************************************************)
+
+function bar01 : int
+ var_input
+  XXXX, a_1, b_1: int;
+ end_var
+ a_1 := 1;
+end_function
+
+function_block bar02
+ var_input
+   a_1, XXXX, b_1: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar03
+ var_input
+   a_1, b_1, XXXX: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+
+function_block bar04
+ var_output
+  XXXX, a_1, b_1: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar05
+ var_output
+   a_1, XXXX, b_1: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar06
+ var_output
+   a_1, b_1, XXXX: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+
+function_block bar07
+ var_in_out
+  XXXX, a_1, b_1: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar08
+ var_in_out
+   a_1, XXXX, b_1: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar09
+ var_in_out
+   a_1, b_1, XXXX: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar10
+ var_external
+   XXXX: int;
+   a_1 : int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar11
+ var_external
+   a_1 : int;
+   XXXX : int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar12
+ var
+  XXXX, a_1, b_1: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar13
+ var
+   a_1, XXXX, b_1: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+function_block bar14
+ var
+   a_1, b_1, XXXX: int;
+ end_var
+ a_1 := 1;
+end_function_block
+
+
+
+(************************************************)
+(* Using XXXX as a standard variable name in ST *)
+(************************************************)
+
+function_block bar90
+ var
+  e_1, f_1 : int;
+  XXXX : int;
+  fb : foo_fb;
+ end_var
+  e_1 := bar01 (XXXX := 10);
+  e_1 := bar01 (a_1 := XXXX);
+  e_1 := bar01 (XXXX := XXXX);
+  fb(XXXX, 20);
+  fb (10, XXXX, e_1, f_1);
+  fb (a_1 := XXXX, b_1:=XXXX, c_1=>XXXX, d_1=>f_1);
+  fb(a_1 := 10, b_1:=20, c_1=>e_1, d_1=>XXXX);
+  fb (c_1=>XXXX, a_1:=20, d_1=>f_1);
+  XXXX := fb.c_1;
+  fb.a_1 := XXXX + XXXX * 2 * (XXXX) / foo_f1(XXXX, 10, XXXX, e_1) MOD XXXX MOD XXXX ** XXXX;
+  IF (XXXX >= 10) THEN XXXX := 10; END_IF;
+  CASE (XXXX + 10) OF
+    10: XXXX := 10; 
+    10..20:XXXX := 20;
+    ELSE XXXX := 20;
+  END_CASE;
+  FOR XXXX := 10 TO 20 BY 2 DO
+    XXXX := XXXX + 1;
+  END_FOR;
+  FOR e_1 := XXXX TO 20 DO
+    XXXX := XXXX + 1;
+  END_FOR;
+  FOR e_1 := 10 TO XXXX BY 2 DO
+    XXXX := XXXX + 1;
+  END_FOR;
+  FOR e_1 := 10 TO XXXX DO
+    XXXX := XXXX + 1;
+  END_FOR;
+  FOR e_1 := 10 TO 20 BY XXXX DO
+    XXXX := XXXX + 1;
+  END_FOR;
+  WHILE (XXXX >= 10) DO 
+    XXXX := 10; 
+  END_WHILE;
+  REPEAT XXXX := 10; UNTIL (XXXX >= 10) END_REPEAT;
+end_function_block
+
+
+
+(* Using XXXX as a function block instance/variable name in ST *)
+
+function_block bar91
+ var
+  e_1, f_1 : int;
+  XXXX : foo_fb;
+ end_var
+  XXXX(e_1, 20);
+  XXXX (10, e_1, e_1, f_1);
+  XXXX (a_1 := e_1, b_1:=e_1 , c_1=>e_1, d_1=>f_1);
+  XXXX(a_1 := 10, b_1:=20, c_1=>e_1, d_1=>e_1);
+  XXXX (c_1=>e_1, a_1:=20, d_1=>f_1);
+  e_1 := XXXX.c_1;
+  XXXX.a_1 := e_1;
+  e_1 := foo_f2(XXXX, XXXX, e_1, f_1);
+  e_1 := foo_f2 (XXXX, XXXX);
+  e_1 := foo_f2 (c_1 => e_1, b_1 := XXXX, d_1 := 10, a_1 := XXXX);
+  e_1 := foo_f2 (b_1 := XXXX);
+end_function_block
+
+
+
+
+(************************************************)
+(* Using XXXX as a standard variable name in IL *)
+(************************************************)
+
+(* NOTE: Currently not supported for identifiers identical to IL operators.
+ *       We therefore have two versions of this file, one with the following code
+ *       commented out (used to test the identifiers that clash with IL operators)
+ *       and a second with the following code included (used to test identifiers
+ *       that do not clash with IL operators, such as PRIORITY, SINGLE, etc...)
+ *)
+
+
+(*
+function_block bar93
+ var
+  e_1, f_1 : int;
+ end_var
+
+ (* Calling function with input parameter named XXXX **
+ bar01 (
+  XXXX := 10
+ )
+end_function_block
+*)
+
+
+(*
+function_block bar99
+(...)
+end_function_block
+*)
+
+
+
+
+
+
+(*************************************************************************************)
+(* Using XXXX as a function block instance/variable/program name in a configuration. *)
+(*************************************************************************************)
+
+(* a helper program *)
+PROGRAM bar000
+VAR_INPUT
+  a_1, XXXX : BOOL;
+END_VAR
+VAR_OUTPUT
+  b_1 : BOOL;
+END_VAR
+  a_1 := TRUE;
+END_PROGRAM
+
+
+ (* using in program parameter *)
+CONFIGURATION config01
+ TASK fast(PRIORITY := 4);
+ PROGRAM foo WITH fast:
+       bar000(a_1 := TRUE, XXXX := FALSE);
+END_CONFIGURATION
+
+
+ (* using as a program name *)
+CONFIGURATION config02
+ TASK fast(PRIORITY := 4);
+ PROGRAM XXXX WITH fast:
+       bar000(a_1 := TRUE, XXXX := FALSE);
+END_CONFIGURATION
+
+
+ (* using as a resource name *)
+CONFIGURATION config03
+ RESOURCE XXXX on processor_type_1
+   TASK fast(PRIORITY := 4);
+   PROGRAM foo WITH fast:
+           bar000(a_1 := TRUE, XXXX := FALSE);
+ END_RESOURCE
+END_CONFIGURATION
+
+
+ (* using as a task name *)
+CONFIGURATION config11
+ TASK XXXX(PRIORITY := 4);
+ PROGRAM foo WITH XXXX:
+       bar000(a_1 := TRUE, XXXX := FALSE);
+END_CONFIGURATION
+
+
+CONFIGURATION config12
+ TASK XXXX(SINGLE := 3, PRIORITY := 4);
+ PROGRAM P1 WITH XXXX:
+       bar000(a_1 := TRUE, XXXX := FALSE);
+END_CONFIGURATION
+
+
+CONFIGURATION config13
+ TASK XXXX(INTERVAL := T#1s, PRIORITY := 4);
+ PROGRAM P1 WITH XXXX:
+       bar000(a_1 := TRUE, XXXX := FALSE);
+END_CONFIGURATION
+
+
+CONFIGURATION config14
+ TASK XXXX(SINGLE := 3, INTERVAL := T#1s, PRIORITY := 4);
+ PROGRAM P1 WITH XXXX:
+       bar000(a_1 := TRUE, XXXX := FALSE);
+END_CONFIGURATION
+
+
+ (* using as a variable name *)
+CONFIGURATION config21
+ VAR_GLOBAL
+  XXXX : bool;
+ END_VAR
+ TASK fast(PRIORITY := 4);
+ PROGRAM foo WITH fast:
+       bar000(a_1 := XXXX, b_1 => XXXX, XXXX := XXXX);
+END_CONFIGURATION
+
+
+
+
+
+
+
+
+
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_as_variable2.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,303 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * variable name/identifier
+ *
+ * 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 NOT 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 
+#IL_operators #PT #PV #R #R1 #RET #RETC #RETCN #S #S1 #ST #STN #XORN
+     NOTE: R and S are identical to IL operators!!
+#SFC_qualifiers D DS L N P #R #S SD SL   
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+(* NOTE: The identifier as a variable test has some special cases.
+ *       Namely, when using IL operators as variable names.
+ *       Even though the syntax of the IL language would not result
+ *       in ambiguities in the above case, our parser does not currently
+ *       allow the use of variables (with names identical to IL
+ *       operators) within IL code.
+ *
+ *       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
+ *)
+
+
+
+(* A helper FUNCTION BLOCK declaration *)
+function_block foo_fb
+ var_input
+  a_1, b_1: int;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10 + b_1;
+end_function_block
+
+
+(* A helper FUNCTION declaration *)
+function foo_f1 : int
+ var_input
+  a_1, b_1: int;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10 + b_1;
+end_function
+
+(* Another helper FUNCTION declaration *)
+function foo_f2 : int
+ var_input
+  a_1, b_1: foo_fb;
+ end_var
+ var_output
+  c_1, d_1: int;
+ end_var
+  c_1 := 10;
+end_function
+
+(* Another helper FUNCTION declaration *)
+function bar01 : int
+ var_input
+  XXXX, a_1, b_1: int;
+ end_var
+ a_1 := 1;
+end_function
+
+(* Another helper FUNCTION_BLOCK declaration *)
+function_block bar91
+ var
+  e_1, f_1 : int;
+  XXXX : foo_fb;
+ end_var
+  e_1 := 0;
+end_function_block
+
+
+
+
+
+
+
+(* Using XXXX as a standard variable name in IL *)
+
+(* NOTE: Currently not supported for identifiers identical to IL operators.
+ *       We therefore have two versions of this file, one with the following code
+ *       commented out (used to test the identifiers that clash with IL operators)
+ *       and a second with the following code included (used to test identifiers
+ *       that do not clash with IL operators, such as PRIORITY, SINGLE, etc...)
+ *)
+
+
+
+function_block bar92
+ var
+  e_1, f_1 : int;
+  XXXX : bool;
+  fb : foo_fb;
+  fb2 : bar91;
+ end_var
+ (* IL operators that - acording to the standard - are not keywords *)
+ LD XXXX
+ LDN XXXX
+ ANDN XXXX
+ ORN XXXX
+ XORN XXXX
+ R XXXX
+ S XXXX
+ ST XXXX
+ STN XXXX
+
+ (* IL operators that - acording to the standard - are also keywords *)
+ AND XXXX
+ OR XXXX
+ XOR XXXX
+ NOT XXXX
+end_function_block
+
+
+function_block bar93
+ var
+  e_1, f_1 : int;
+  XXXX : int;
+ end_var
+
+ (* IL operators that - acording to the standard - are also keywords *)
+ ADD XXXX
+ SUB XXXX
+ MUL XXXX
+ DIV XXXX
+ MOD XXXX
+ GE XXXX
+ GT XXXX
+ LE XXXX
+ LT XXXX
+ EQ XXXX
+ NE XXXX
+
+ (* Calling function with input parameter named XXXX *)
+ bar01 (
+  XXXX := 10
+ )
+ bar01 (
+  a_1 := XXXX
+ )
+ bar01 (
+  XXXX := XXXX
+ )
+end_function_block
+
+
+
+
+(* a helper function block *)
+function_block bar94
+ var_input
+  e_1, f_1 : int;
+  XXXX : foo_fb;
+ end_var
+  e_1 := XXXX.c_1;
+end_function_block
+
+
+function_block bar95
+ var
+  e_1, f_1 : int;
+  XXXX : foo_fb;
+  fb_1 : bar93;
+ end_var
+ CAL XXXX(10)
+ CAL XXXX (e_1)
+ CAL XXXX (10, e_1, e_1, f_1)
+ CAL XXXX (
+    a_1 := 10,
+    b_1 := e_1,
+    c_1 => e_1,
+    d_1 => f_1
+   )
+ CAL XXXX (
+    a_1 := 10,
+    c_1 => e_1
+   )
+
+ CALC XXXX(10)
+ CALC XXXX (e_1)
+ CALC XXXX (10, e_1, e_1, f_1)
+ CALC XXXX (
+    a_1 := 10,
+    b_1 := e_1,
+    c_1 => e_1,
+    d_1 => f_1
+   )
+ CALC XXXX (
+    a_1 := 10,
+    c_1 => e_1
+   )
+
+ CALCN XXXX(10)
+ CALCN XXXX (e_1)
+ CALCN XXXX (10, e_1, e_1, f_1)
+ CALCN XXXX (
+    a_1 := 10,
+    b_1 := e_1,
+    c_1 => e_1,
+    d_1 => f_1
+   )
+ CALCN XXXX (
+    a_1 := 10,
+    c_1 => e_1
+   )
+
+ LD XXXX.a_1
+ ST XXXX.b_1
+ LD fb_1.XXXX
+ ST fb_1.XXXX
+ LD fb_1.XXXX.a_1
+ ST fb_1.XXXX.a_1
+
+ LD XXXX
+ foo_f2 XXXX, e_1, f_1
+ foo_f2 (
+    a_1 := XXXX,
+    b_1 := XXXX,
+    c_1 => e_1,
+    d_1 => f_1
+   )
+
+ (* Calling function with input parameter named XXXX *)
+ bar01 (
+  XXXX := 10
+ )
+ bar01 (
+  a_1 := XXXX.a_1
+ )
+ bar01 (
+  XXXX := XXXX.a_1
+ )
+end_function_block
+
+
+function_block bar96
+ var
+  e_1, f_1 : int;
+  XXXX : CTUD;
+ end_var
+ CU XXXX
+ CD XXXX
+ PV XXXX
+end_function_block
+
+
+function_block bar97
+ var
+  e_1, f_1 : int;
+  XXXX : R_TRIG;
+ end_var
+ CLK XXXX
+end_function_block
+
+
+
+function_block bar98
+ var
+  e_1, f_1 : int;
+  XXXX : TP;
+ end_var
+ IN XXXX
+ PT XXXX
+end_function_block
+
+
+
+function_block bar99
+ var
+  e_1, f_1 : int;
+  XXXX : SR;
+ end_var
+ R1 XXXX
+ S1 XXXX
+end_function_block
+
+
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/identifier_in_sfc.test	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,611 @@
+(* Test whether the keyword XXXX may be used as an identifier for:
+ * STEP, ACTION and TRANSITION name/identifier
+ *
+ * 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.
+ *)
+(*
+#IL_operators ANDN CAL CALC CALCN CD CLK CU IN JMP JMPC JMPCN 
+#IL_operators 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
+     NOTE: R and S are identical to IL operators!!
+#Task_initialisers PRIORITY SINGLE INTERVAL
+*)
+
+
+
+(* Use of XXXX as a STEP identifier *)
+
+PROGRAM bar01
+  VAR
+    IX1 AT %IX1 : BOOL;
+    IX2 AT %IX2 : BOOL;
+    IX3 AT %IX3 : BOOL;
+  END_VAR
+
+  INITIAL_STEP XXXX:
+  END_STEP
+
+  STEP STEP1:
+  END_STEP
+
+  STEP STEP2:
+  END_STEP
+
+  TRANSITION FROM XXXX TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  TRANSITION FROM STEP1 TO XXXX
+    := IX1 = TRUE;
+  END_TRANSITION
+
+  TRANSITION (PRIORITY := 4) FROM XXXX TO STEP2
+    := IX2 = TRUE;
+  END_TRANSITION
+
+  TRANSITION (PRIORITY := 4) FROM STEP2 TO XXXX
+    := IX2 = TRUE;
+  END_TRANSITION
+
+  TRANSITION transition_id1 FROM STEP2 TO XXXX
+    := IX1 = FALSE AND IX3 = FALSE;
+  END_TRANSITION
+
+  TRANSITION transition_id2 FROM XXXX TO STEP2
+    := IX1 = FALSE AND IX3 = FALSE;
+  END_TRANSITION
+
+  TRANSITION transition_id3 (PRIORITY := 3) FROM XXXX TO STEP2
+    := IX3 = TRUE;
+  END_TRANSITION
+
+  TRANSITION transition_id4 (PRIORITY := 5) FROM STEP2 TO XXXX
+    := IX3 = TRUE;
+  END_TRANSITION
+
+  TRANSITION FROM (XXXX, STEP2) TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  TRANSITION FROM (STEP2, XXXX) TO STEP1
+    := IX2 = FALSE;
+  END_TRANSITION
+
+  TRANSITION FROM STEP1 TO (XXXX, STEP2)
+    := IX1 = TRUE;
+  END_TRANSITION
+
+  TRANSITION FROM STEP1 TO (STEP2, XXXX)
+    := IX2 = TRUE;
+  END_TRANSITION
+END_PROGRAM
+
+
+
+
+(* Use of XXXX as a TRANSITION identifier *)
+
+PROGRAM bar02
+  VAR
+    IX1 AT %IX1 : BOOL;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+  END_STEP
+
+  TRANSITION XXXX FROM GO TO STEP1
+    := IX1 = FALSE AND IX3 = FALSE;
+  END_TRANSITION
+END_PROGRAM
+
+
+
+
+PROGRAM bar03
+  VAR
+    IX1 AT %IX1 : BOOL;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+  END_STEP
+
+  TRANSITION XXXX (PRIORITY := 3) FROM GO TO STEP1
+    := IX3 = TRUE;
+  END_TRANSITION
+END_PROGRAM
+
+
+
+
+
+(* Use of XXXX as an ACTION identifier *)
+
+
+PROGRAM bar20
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+  STEP STEP1:
+    XXXX ();
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+PROGRAM bar21
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(N);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+PROGRAM bar22
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(P);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+PROGRAM bar23
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(R);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+
+
+PROGRAM bar24
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(S);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+
+PROGRAM bar25
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(D, T#1s);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+
+PROGRAM bar26
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(L, T#1s);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+PROGRAM bar27
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(DS, T#1s);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+
+PROGRAM bar28
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(SD, T#1s);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+
+PROGRAM bar29
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(SL, T#1s);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+
+PROGRAM bar30
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(L, delta_1);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+
+PROGRAM bar31
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    XXXX(L, delta_1, IX1, QX1);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+PROGRAM bar32
+  VAR
+    QX1 : BOOL := 1;
+    QX2 : BOOL := 0;
+    QX3 : BOOL;
+    IX1 : BOOL;
+    IX2 : BOOL;
+    IX3 : BOOL;
+    delta_1 : TIME := T#1s;
+  END_VAR
+
+  INITIAL_STEP GO:
+  END_STEP
+
+  STEP STEP1:
+    INLINE1 (); 
+    XXXX(L, delta_1, IX1, QX1);
+    INLINE2 (); 
+  END_STEP
+
+  STEP STEP2:
+    XXXX(L, delta_1, IX1, QX1);
+    INLINE1 (); 
+    INLINE2 (); 
+  END_STEP
+
+  STEP STEP3:
+    INLINE1 (); 
+    INLINE2 (); 
+    XXXX(L, delta_1, IX1, QX1);
+  END_STEP
+
+  TRANSITION FROM GO TO STEP1
+    := IX1 = FALSE;
+  END_TRANSITION
+
+  ACTION XXXX:
+    QX1 := TRUE;
+    QX2 := TRUE;
+  END_ACTION
+
+  ACTION INLINE1:
+    IX1 := TRUE;
+  END_ACTION
+
+  ACTION INLINE2:
+    IX1 := TRUE;
+  END_ACTION
+END_PROGRAM
+
+
+
+
+
+
+
+
+
+
+(* Checking whether the use of XXXX will confuse any other
+ * normal and correct IL or ST code.
+ *)
+{#include "basic_code.test" }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/syntax/identifier/runtests	Sat Feb 09 08:57:14 2008 +0100
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# assume no error to start with...
+error=0
+
+for ff in `ls *.test`
+do
+  for id in `cat $ff | grep "^#" | sed "s/#[^ ]*//g"`
+  do
+	sed s/XXXX/$id/g $ff > $ff"_"$id.iec
+	if `../../../iec2iec $ff"_"$id.iec -I ../../../lib > $ff"_"$id.out 2>$ff"_"$id.err`
+		# TODO before deciding test is success [OK]
+		#       - test whether xxx.out has size <> 0
+		#       - test whether xxx.err has size == 0
+		#       - (?) test whether xxx.out2 is identical to xxx.out
+		#       - (?) test whether xxx.err2 has size == 0
+		#       - perhaps produce a [WARN] instead of [ERROR] in cases of (?)
+	  then echo "[ O K ]   " $ff "->" $id
+	  else echo "[ERROR]   " $ff "->" $id; error=1
+	fi
+#	../../../iec2iec $ff"_"$id.out -I ../../../lib > $ff"_"$id.out2 2>$ff"_"$id.err2
+  done
+done
+
+echo
+if `test $error = 1`
+  then echo "FAILURE -> At least one of the tests failed!"
+  else echo "SUCCESS -> All tests passed!"
+fi