Correctly identify errors when parsing erroneous code (make sure flex goes back to INITIAL state when code contains errors that do not allow determining whether ST or IL is being parsed)
FUNCTION_BLOCK DELAY (* N-sample delay *)
VAR_INPUT
RUN : BOOL ; (* 1 = run, 0 = reset *)
XIN : REAL ;
N : INT (* 0 <= N < 128 or manufacturer- *)
END_VAR (* specified maximum value *)
VAR_OUTPUT XOUT : REAL; END_VAR (* Delayed output *)
VAR X : ARRAY [0..127] (* N-Element queue *)
OF REAL; (* with FIFO discipline *)
I, IXIN, IXOUT : INT := 0;
END_VAR
IF RUN THEN IXIN := MOD(IXIN + 1, 128) ; X[IXIN] := XIN ;
IXOUT := MOD(IXOUT + 1, 128) ; XOUT := X[IXOUT];
ELSE XOUT := XIN ; IXIN := N ; IXOUT := 0;
FOR I := 0 TO N DO X[I] := XIN; END_FOR;
END_IF ;
END_FUNCTION_BLOCK