=========================
Simple Declaration
=========================
parser simple() {
  state start {
    bool l;
    transition accept;
  }
};

---
(p4program
 (declaration
  (parserDeclaration
   (parserType
    (parser)
    (identifier)
    (parameters)
   )
   (parserStates
    (parserState
     (state)
     (identifier)
     (parserStatements
      (parserStatement
       (variableDeclaration
        (typeRef
         (baseType
          (bool)
         )
        )
        (identifier)
       )
      )
     )
     (parserTransitionStatement
      (transition)
      (transitionSelectionExpression
       (identifier)
      )
     )
    )
   )
  )
 )
)

=========================
Simple Declaration (infinite-precision int)
=========================
parser simple() {
  state start {
    int l;
    transition accept;
  }
};

---
(p4program
 (declaration
  (parserDeclaration
   (parserType
    (parser)
    (identifier)
    (parameters)
   )
   (parserStates
    (parserState
     (state)
     (identifier)
     (parserStatements
      (parserStatement
       (variableDeclaration
        (typeRef
         (baseType
          (int_type
           (int)
          )
         )
        )
        (identifier)
       )
      )
     )
     (parserTransitionStatement
      (transition)
      (transitionSelectionExpression
       (identifier)
      )
     )
    )
   )
  )
 )
)

=========================
Simple Declaration (fixed-precision int)
=========================
parser simple() {
  state start {
    int<55> l;
    transition accept;
  }
};

---
(p4program
 (declaration
  (parserDeclaration
   (parserType
    (parser)
    (identifier)
    (parameters)
   )
   (parserStates
    (parserState
     (state)
     (identifier)
     (parserStatements
      (parserStatement
       (variableDeclaration
        (typeRef
         (baseType
          (int_type
           (int)
           (bit_width
            (integer)
           )
          )
         )
        )
        (identifier)
       )
      )
     )
     (parserTransitionStatement
      (transition)
      (transitionSelectionExpression
       (identifier)
      )
     )
    )
   )
  )
 )
)


=========================
Simple Declaration (string)
=========================
parser simple() {
  state start {
    string l;
    transition accept;
  }
};

---
(p4program
 (declaration
  (parserDeclaration
   (parserType
    (parser)
    (identifier)
    (parameters)
   )
   (parserStates
    (parserState
     (state)
     (identifier)
     (parserStatements
      (parserStatement
       (variableDeclaration
        (typeRef
         (baseType
          (string)
         )
        )
        (identifier)
       )
      )
     )
     (parserTransitionStatement
      (transition)
      (transitionSelectionExpression
       (identifier)
      )
     )
    )
   )
  )
 )
)

=========================
Simple Declaration (string with initial value)
=========================
parser simple() {
  state start {
    string l = "testing";
    transition accept;
  }
};

---
(p4program
 (declaration
  (parserDeclaration
   (parserType
    (parser)
    (identifier)
    (parameters)
   )
   (parserStates
    (parserState
     (state)
     (identifier)
     (parserStatements
      (parserStatement
       (variableDeclaration
        (typeRef
         (baseType
          (string)
         )
        )
        (identifier)
        (assignment)
        (expression
         (simple_expression
          (string_literal)
         )
        )
       )
      )
     )
     (parserTransitionStatement
      (transition)
      (transitionSelectionExpression
       (identifier)
      )
     )
    )
   )
  )
 )
)

=========================
Non Basic Type Declaration (No Initial Value)
=========================
parser simple() {
  state start {
    header_t header;
    transition accept;
  }
};

---
(p4program
 (declaration
  (parserDeclaration
   (parserType
    (parser)
    (identifier)
    (parameters)
   )
   (parserStates
    (parserState
     (state)
     (identifier)
     (parserStatements
      (parserStatement
       (variableDeclaration
        (typeRef
         (type_identifier)
        )
        (identifier)
       )
      )
     )
     (parserTransitionStatement
      (transition)
      (transitionSelectionExpression
       (identifier)
      )
     )
    )
   )
  )
 )
)

=========================
Simple Struct Type Declaration
=========================
struct Testing {
  string fieldA;
};
---
(p4program
 (declaration
  (type_declaration
   (struct_declaration
    (struct)
    (identifier)
    (struct_declaration_fields
     (variableDeclaration
      (typeRef
       (baseType
        (string)
       )
      )
      (identifier)
     )
    )
   )
  )
 )
)

=========================
Simple Function Declaration
=========================
bool functionb() {
  string fieldA;
};
---
(p4program
 (declaration
  (function_declaration
   (typeRef
    (baseType
     (bool)
    )
   )
   (identifier)
   (parameters)
   (blockStatement
    (statements
     (statement
      (variableDeclaration
       (typeRef
        (baseType
         (string)
        )
       )
      (identifier)
      )
     )
    )
   )
  )
 )
)

=========================
Function Declaration With Parameters
=========================
bool functionb(bool a, int b) {
  string fieldA;
};
---
(p4program
 (declaration
  (function_declaration
   (typeRef
    (baseType
     (bool)
    )
   )
   (identifier)
   (parameters
    (parameter_list
     (parameter_list
      (parameter
       (typeRef
        (baseType
         (bool)
        )
       )
       (identifier)
      )
     )
     (parameter
      (typeRef
       (baseType
        (int_type
         (int)
        )
       )
      )
      (identifier)
     )
    )
   )
   (blockStatement
    (statements
     (statement
      (variableDeclaration
       (typeRef
        (baseType
         (string)
        )
       )
      (identifier)
      )
     )
    )
   )
  )
 )
)
=========================
Function Declaration With Parameters And Directions
=========================
bool functionb(in bool a, out int b, inout string c) {
  string fieldA;
};
---
(p4program
 (declaration
  (function_declaration
   (typeRef
    (baseType
     (bool)
    )
   )
   (identifier)
   (parameters
    (parameter_list
     (parameter_list
      (parameter_list
       (parameter
        (direction
         (in)
        )
        (typeRef
         (baseType
         (bool)
         )
        )
        (identifier)
       )
      )
      (parameter
       (direction
        (out)
       )
       (typeRef
        (baseType
         (int_type
          (int)
         )
        )
       )
       (identifier)
      )
     )
     (parameter
      (direction
       (inout)
      )
      (typeRef
       (baseType
        (string)
       )
      )
      (identifier)
     )
    )
   )
   (blockStatement
    (statements
     (statement
      (variableDeclaration
       (typeRef
        (baseType
         (string)
        )
       )
      (identifier)
      )
     )
    )
   )
  )
 )
)
=========================
Extern Function Declaration
=========================
extern bool functionb(in bool a, out int b, inout string c);
---
(p4program
 (declaration
  (extern_declaration
   (extern)
   (declaration
    (function_declaration
     (typeRef
      (baseType
       (bool)
      )
     )
     (identifier)
     (parameters
      (parameter_list
       (parameter_list
        (parameter_list
         (parameter
          (direction
           (in)
          )
          (typeRef
           (baseType
           (bool)
           )
          )
          (identifier)
         )
        )
        (parameter
         (direction
          (out)
         )
         (typeRef
          (baseType
           (int_type
            (int)
           )
          )
         )
         (identifier)
        )
       )
       (parameter
        (direction
         (inout)
        )
        (typeRef
         (baseType
          (string)
         )
        )
        (identifier)
       )
      )
     )
    )
   )
  )
 )
)
