//===-- llvm/Assembly/Parser.h - Parser for VM assembly files ---*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  These classes are implemented by the lib/AsmParser library.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_ASSEMBLY_PARSER_H
#define LLVM_ASSEMBLY_PARSER_H

#include <string>

namespace llvm {

class Module;
class ParseException;


// The useful interface defined by this file... Parse an ascii file, and return
// the internal representation in a nice slice'n'dice'able representation.  Note
// that this does not verify that the generated LLVM is valid, so you should run
// the verifier after parsing the file to check that it's ok.
//
Module *ParseAssemblyFile(const std::string &Filename);// throw (ParseException)
Module *ParseAssemblyString(const char * AsmString, Module * M);// throw (ParseException)

//===------------------------------------------------------------------------===
//                              Helper Classes
//===------------------------------------------------------------------------===

// ParseException - For when an exceptional event is generated by the parser.
// This class lets you print out the exception message
//
class ParseException {
public:
  ParseException(const std::string &filename, const std::string &message,
                 int LineNo = -1, int ColNo = -1);

  ParseException(const ParseException &E);

  // getMessage - Return the message passed in at construction time plus extra
  // information extracted from the options used to parse with...
  //
  const std::string getMessage() const;

  inline const std::string &getRawMessage() const {   // Just the raw message...
    return Message;
  }

  inline const std::string &getFilename() const {
    return Filename;
  }

  // getErrorLocation - Return the line and column number of the error in the
  // input source file.  The source filename can be derived from the
  // ParserOptions in effect.  If positional information is not applicable,
  // these will return a value of -1.
  //
  inline const void getErrorLocation(int &Line, int &Column) const {
    Line = LineNo; Column = ColumnNo;
  }

private :
  std::string Filename;
  std::string Message;
  int LineNo, ColumnNo;                               // -1 if not relevant

  ParseException &operator=(const ParseException &E); // objects by reference
};

} // End llvm namespace

#endif
