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 DIFFEQ
VAR_INPUT
RUN : BOOL ; (* 1 = run, 0 = reset *)
XIN : REAL ;
A : ARRAY[1..] OF REAL ; (* Input coefficients *)
M : INT ; (* Length of input history *)
B : ARRAY[0..] OF REAL ; (* Output coefficients *)
N : INT ; (* Length of output history *)
END_VAR
VAR_OUTPUT XOUT : REAL := 0.0 ; END_VAR
VAR (* NOTE : Manufacturer may specify other array sizes *)
XI : ARRAY [0..128] OF REAL ; (* Input history *)
XO : ARRAY [0..128] OF REAL ; (* Output history *)
I : INT ;
END_VAR
XO[0] := XOUT ; XI[0] := XIN ;
XOUT := B[0] * XIN ;
IF RUN THEN
FOR I := M TO 1 BY -1 DO
XOUT := XOUT + A[I] * XO[I] ; XO[I] := XO[I-1];
END_FOR;
FOR I := N TO 1 BY -1 DO
XOUT := XOUT + B[I] * XI[I] ; XI[I] := XI[I-1];
END_FOR;
ELSE
FOR I := 1 TO M DO XO[I] := 0.0; END_FOR;
FOR I := 1 TO N DO XI[I] := 0.0; END_FOR;
END_IF ;
END_FUNCTION_BLOCK