exceptions.h 5.32 KB
Newer Older
1
2
#pragma once

3
#include "mark.h"
4
5
#include <exception>
#include <string>
6
#include <sstream>
7
8
9
10
11
12

namespace YAML
{
	// error messages
	namespace ErrorMsg
	{
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
		const std::string YAML_DIRECTIVE_ARGS    = "YAML directives must have exactly one argument";
		const std::string YAML_VERSION           = "bad YAML version: ";
		const std::string YAML_MAJOR_VERSION     = "YAML major version too large";
		const std::string TAG_DIRECTIVE_ARGS     = "TAG directives must have exactly two arguments";
		const std::string END_OF_MAP             = "end of map not found";
		const std::string END_OF_MAP_FLOW        = "end of map flow not found";
		const std::string END_OF_SEQ             = "end of sequence not found";
		const std::string END_OF_SEQ_FLOW        = "end of sequence flow not found";
		const std::string MULTIPLE_TAGS          = "cannot assign multiple tags to the same node";
		const std::string MULTIPLE_ANCHORS       = "cannot assign multiple anchors to the same node";
		const std::string MULTIPLE_ALIASES       = "cannot assign multiple aliases to the same node";
		const std::string ALIAS_CONTENT          = "aliases can't have any content, *including* tags";
		const std::string INVALID_HEX            = "bad character found while scanning hex number";
		const std::string INVALID_UNICODE        = "invalid unicode: ";
		const std::string INVALID_ESCAPE         = "unknown escape character: ";
		const std::string UNKNOWN_TOKEN          = "unknown token";
		const std::string DOC_IN_SCALAR          = "illegal document indicator in scalar";
		const std::string EOF_IN_SCALAR          = "illegal EOF in scalar";
		const std::string CHAR_IN_SCALAR         = "illegal character in scalar";
		const std::string TAB_IN_INDENTATION     = "illegal tab when looking for indentation";
		const std::string FLOW_END               = "illegal flow end";
		const std::string BLOCK_ENTRY            = "illegal block entry";
		const std::string MAP_KEY                = "illegal map key";
		const std::string MAP_VALUE              = "illegal map value";
		const std::string ALIAS_NOT_FOUND        = "alias not found after *";
		const std::string ANCHOR_NOT_FOUND       = "anchor not found after &";
		const std::string CHAR_IN_ALIAS          = "illegal character found while scanning alias";
		const std::string CHAR_IN_ANCHOR         = "illegal character found while scanning anchor";
		const std::string ZERO_INDENT_IN_BLOCK   = "cannot set zero indentation for a block scalar";
		const std::string CHAR_IN_BLOCK          = "unexpected character in block scalar";
43
44
		const std::string AMBIGUOUS_ANCHOR     = "cannot assign the same alias to multiple nodes";
		const std::string UNKNOWN_ANCHOR       = "the referenced anchor is not defined";
45

46
47
48
49
50
51
52
53
54
55
56
57
58
59
		const std::string INVALID_SCALAR         = "invalid scalar";
		const std::string KEY_NOT_FOUND          = "key not found";
		const std::string BAD_DEREFERENCE        = "bad dereference";
		
		const std::string UNMATCHED_GROUP_TAG    = "unmatched group tag";
		const std::string UNEXPECTED_END_SEQ     = "unexpected end sequence token";
		const std::string UNEXPECTED_END_MAP     = "unexpected end map token";
		const std::string SINGLE_QUOTED_CHAR     = "invalid character in single-quoted string";
		const std::string INVALID_ANCHOR         = "invalid anchor";
		const std::string INVALID_ALIAS          = "invalid alias";
		const std::string EXPECTED_KEY_TOKEN     = "expected key token";
		const std::string EXPECTED_VALUE_TOKEN   = "expected value token";
		const std::string UNEXPECTED_KEY_TOKEN   = "unexpected key token";
		const std::string UNEXPECTED_VALUE_TOKEN = "unexpected value token";
60
	}
61
62
63

	class Exception: public std::exception {
	public:
64
65
		Exception(const Mark& mark_, const std::string& msg_)
			: mark(mark_), msg(msg_) {
66
				std::stringstream output;
67
				output << "Error at line " << mark.line+1 << ", column " << mark.column+1 << ": " << msg;
68
69
				what_ = output.str();
			}
70
		virtual ~Exception() throw() {}
71
		virtual const char *what() const throw() { return what_.c_str(); }
72

73
		Mark mark;
74
		std::string msg;
75
76
77
		
	private:
		std::string what_;
78
79
80
81
	};

	class ParserException: public Exception {
	public:
82
83
		ParserException(const Mark& mark_, const std::string& msg_)
			: Exception(mark_, msg_) {}
84
85
86
87
	};

	class RepresentationException: public Exception {
	public:
88
89
		RepresentationException(const Mark& mark_, const std::string& msg_)
			: Exception(mark_, msg_) {}
90
91
92
93
94
	};

	// representation exceptions
	class InvalidScalar: public RepresentationException {
	public:
95
96
		InvalidScalar(const Mark& mark_)
			: RepresentationException(mark_, ErrorMsg::INVALID_SCALAR) {}
97
98
99
100
	};

	class KeyNotFound: public RepresentationException {
	public:
101
102
		KeyNotFound(const Mark& mark_)
			: RepresentationException(mark_, ErrorMsg::KEY_NOT_FOUND) {}
103
104
	};

105
106
107
	template <typename T>
	class TypedKeyNotFound: public KeyNotFound {
	public:
108
109
		TypedKeyNotFound(const Mark& mark_, const T& key_)
			: KeyNotFound(mark_), key(key_) {}
110
		~TypedKeyNotFound() throw() {}
111
112
113
114
115

		T key;
	};

	template <typename T>
116
117
	TypedKeyNotFound <T> MakeTypedKeyNotFound(const Mark& mark, const T& key) {
		return TypedKeyNotFound <T> (mark, key);
118
119
	}

120
121
122
	class BadDereference: public RepresentationException {
	public:
		BadDereference()
123
		: RepresentationException(Mark::null(), ErrorMsg::BAD_DEREFERENCE) {}
124
	};
125
126
127
128
	
	class EmitterException: public Exception {
	public:
		EmitterException(const std::string& msg_)
129
		: Exception(Mark::null(), msg_) {}
130
	};
131
}