Add some scaffolding for parsing affine maps:
- parsing affine map identifiers
- place-holder classes for AffineMap
- module contains a list of affine maps (defined at the top level).

PiperOrigin-RevId: 202336919
diff --git a/lib/Parser/Parser.cpp b/lib/Parser/Parser.cpp
index 5a79f1e..0d24972 100644
--- a/lib/Parser/Parser.cpp
+++ b/lib/Parser/Parser.cpp
@@ -21,6 +21,7 @@
 
 #include "mlir/Parser.h"
 #include "Lexer.h"
+#include "mlir/IR/AffineMap.h"
 #include "mlir/IR/Module.h"
 #include "mlir/IR/CFGFunction.h"
 #include "mlir/IR/Types.h"
@@ -68,6 +69,11 @@
   // This is the result module we are parsing into.
   std::unique_ptr<Module> module;
 
+  // A map from affine map identifier to AffineMap.
+  // TODO(andydavis) Remove use of unique_ptr when AffineMaps are bump pointer
+  // allocated.
+  llvm::StringMap<std::unique_ptr<AffineMap>> affineMaps;
+
 private:
   // Helper methods.
 
@@ -121,6 +127,9 @@
   Type *parseType();
   ParseResult parseTypeList(SmallVectorImpl<Type*> &elements);
 
+  // Polyhedral structures
+  ParseResult parseAffineMapDef();
+
   // Functions.
   ParseResult parseFunctionSignature(StringRef &name, FunctionType *&type);
   ParseResult parseExtFunc();
@@ -461,6 +470,33 @@
 }
 
 //===----------------------------------------------------------------------===//
+// Polyhedral structures.
+//===----------------------------------------------------------------------===//
+
+/// Affine map declaration.
+///
+///  affine-map-def ::= affine-map-id `=` affine-map-inline
+///  affine-map-inline ::= dim-and-symbol-id-lists `->` multi-dim-affine-expr
+///                        ( `size` `(` dim-size (`,` dim-size)* `)` )?
+///  dim-size ::= affine-expr | `min` `(` affine-expr ( `,` affine-expr)+ `)`
+///
+ParseResult Parser::parseAffineMapDef() {
+  assert(curToken.is(Token::affine_map_id));
+
+  StringRef affineMapId = curToken.getSpelling().drop_front();
+  // Check that 'affineMapId' is unique.
+  // TODO(andydavis) Add a unit test for this case.
+  if (affineMaps.count(affineMapId) > 0)
+    return emitError("encountered non-unique affine map id");
+
+  consumeToken(Token::affine_map_id);
+
+  // TODO(andydavis,bondhugula) Parse affine map definition.
+  affineMaps[affineMapId].reset(new AffineMap(1, 0));
+  return ParseSuccess;
+}
+
+//===----------------------------------------------------------------------===//
 // Functions
 //===----------------------------------------------------------------------===//
 
@@ -701,6 +737,9 @@
     case Token::kw_cfgfunc:
       if (parseCFGFunc()) return nullptr;
       break;
+    case Token::affine_map_id:
+      if (parseAffineMapDef()) return nullptr;
+      break;
 
     // TODO: mlfunc, affine entity declarations, etc.
     }