DEFINITION MODULE Parser;

FROM Common IMPORT Identifier, PIdentifier;

TYPE
  AstConstantDeclaration = RECORD
  END;
  PAstConstantDeclaration = POINTER TO AstConstantDeclaration;
  PPAstConstantDeclaration = POINTER TO PAstConstantDeclaration;

  AstTypeExpressionKind = (
    astTypeExpressionKindNamed,
    astTypeExpressionKindRecord,
    astTypeExpressionKindEnumeration,
    astTypeExpressionKindArray,
    astTypeExpressionKindPointer,
    astTypeExpressionKindProcedure
  );
  AstTypeExpression = RECORD
    CASE kind: AstTypeExpressionKind OF
      astTypeExpressionKindNamed: name: Identifier |
      astTypeExpressionKindEnumeration: cases: PIdentifier
    END
  END;
  PAstTypeExpression = POINTER TO AstTypeExpression;

  AstTypeDeclaration = RECORD
    identifier: Identifier;
    type_expression: PAstTypeExpression
  END;
  PAstTypeDeclaration = POINTER TO AstTypeDeclaration;
  PPAstTypeDeclaration = POINTER TO PAstTypeDeclaration;

  AstVariableDeclaration = RECORD
  END;
  PAstVariableDeclaration = POINTER TO AstVariableDeclaration;
  PPAstVariableDeclaration = POINTER TO PAstVariableDeclaration;

  AstModule = RECORD
    constants: PPAstConstantDeclaration;
    types: PPAstTypeDeclaration;
    variables: PPAstVariableDeclaration
  END;
  PAstModule = POINTER TO AstModule;

END Parser.
