================================================================================
Empty PROGRAM
================================================================================

PROGRAM Empty
END_PROGRAM

--------------------------------------------------------------------------------

(source_file
  (program_declaration
    (identifier)))

================================================================================
PROGRAM with VAR and statements
================================================================================

PROGRAM Counter
VAR count : INT; END_VAR
count := count + 1;
END_PROGRAM

--------------------------------------------------------------------------------

(source_file
  (program_declaration
    (identifier)
    (var_block
      (variable_declaration
        (identifier)
        (elementary_type)))
    (assignment_statement
      (identifier)
      (binary_expression
        (identifier)
        (integer_literal)))))

================================================================================
FUNCTION with simple return type
================================================================================

FUNCTION square : REAL
VAR_INPUT x : REAL; END_VAR
square := x * x;
END_FUNCTION

--------------------------------------------------------------------------------

(source_file
  (function_declaration
    (identifier)
    (elementary_type)
    (var_input
      (variable_declaration
        (identifier)
        (elementary_type)))
    (assignment_statement
      (identifier)
      (binary_expression
        (identifier)
        (identifier)))))

================================================================================
FUNCTION with array return type
================================================================================

FUNCTION make_array : ARRAY [1..3] OF INT
VAR_INPUT a, b, c : INT; END_VAR
make_array[1] := a;
make_array[2] := b;
make_array[3] := c;
END_FUNCTION

--------------------------------------------------------------------------------

(source_file
  (function_declaration
    (identifier)
    (array_type
      (subrange
        (integer_literal)
        (integer_literal))
      (elementary_type))
    (var_input
      (variable_declaration
        (identifier)
        (identifier)
        (identifier)
        (elementary_type)))
    (assignment_statement
      (index_expression
        (identifier)
        (integer_literal))
      (identifier))
    (assignment_statement
      (index_expression
        (identifier)
        (integer_literal))
      (identifier))
    (assignment_statement
      (index_expression
        (identifier)
        (integer_literal))
      (identifier))))

================================================================================
FUNCTION_BLOCK basic
================================================================================

FUNCTION_BLOCK Counter
VAR_INPUT  enable : BOOL; END_VAR
VAR_OUTPUT count  : INT;  END_VAR
VAR        prev   : BOOL; END_VAR
IF enable AND NOT prev THEN
  count := count + 1;
END_IF
prev := enable;
END_FUNCTION_BLOCK

--------------------------------------------------------------------------------

(source_file
  (function_block_declaration
    (identifier)
    (var_input
      (variable_declaration
        (identifier)
        (elementary_type)))
    (var_output
      (variable_declaration
        (identifier)
        (elementary_type)))
    (var_block
      (variable_declaration
        (identifier)
        (elementary_type)))
    (if_statement
      (binary_expression
        (identifier)
        (unary_expression
          (identifier)))
      (assignment_statement
        (identifier)
        (binary_expression
          (identifier)
          (integer_literal))))
    (assignment_statement
      (identifier)
      (identifier))))

================================================================================
TYPE block with multiple definitions
================================================================================

TYPE
  Color : (Red, Green, Blue);
  Point : STRUCT
    x : REAL;
    y : REAL;
  END_STRUCT;
  TempC : REAL(-273.15..1000.0);
  Buffer : ARRAY [0..255] OF BYTE;
  Phone : STRING(20);
  IntPtr : POINTER TO DINT;
END_TYPE

--------------------------------------------------------------------------------

(source_file
  (type_declaration
    (type_definition
      (identifier)
      (enumerated_type_inline
        (enumerator
          (identifier))
        (enumerator
          (identifier))
        (enumerator
          (identifier))))
    (type_definition
      (identifier)
      (structure_type_inline
        (structure_field
          (identifier)
          (elementary_type))
        (structure_field
          (identifier)
          (elementary_type))))
    (type_definition
      (identifier)
      (subrange_type
        (elementary_type)
        (real_literal)
        (real_literal)))
    (type_definition
      (identifier)
      (array_type
        (subrange
          (integer_literal)
          (integer_literal))
        (elementary_type)))
    (type_definition
      (identifier)
      (string_type
        (integer_literal)))
    (type_definition
      (identifier)
      (pointer_type
        (elementary_type)))))

================================================================================
CONFIGURATION with RESOURCE
================================================================================

CONFIGURATION MyConfig
VAR_GLOBAL g_count : INT; END_VAR
RESOURCE R1 ON CPU_001
VAR_GLOBAL r_count : INT; END_VAR
TASK Periodic(INTERVAL := T#10ms, PRIORITY := 1);
PROGRAM Inst1 WITH Periodic : MyProgram;
END_RESOURCE
END_CONFIGURATION

--------------------------------------------------------------------------------

(source_file
  (configuration_declaration
    (identifier)
    (var_global
      (variable_declaration
        (identifier)
        (elementary_type)))
    (resource_declaration
      (identifier)
      (identifier)
      (var_global
        (variable_declaration
          (identifier)
          (elementary_type)))
      (task_declaration
        (identifier)
        (task_parameter
          (identifier)
          (time_literal))
        (task_parameter
          (identifier)
          (integer_literal)))
      (program_assignment
        (identifier)
        (identifier)
        (identifier)))))
