123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #ifndef EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66
- #define EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66
- #if defined(_MSC_VER) || \
- (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
- (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
- #pragma once
- #endif
- #include <ios>
- #include <string>
- #include "regex_yaml.h"
- #include "stream.h"
- namespace YAML {
- ////////////////////////////////////////////////////////////////////////////////
- // Here we store a bunch of expressions for matching different parts of the
- // file.
- namespace Exp {
- // misc
- inline const RegEx& Empty() {
- static const RegEx e;
- return e;
- }
- inline const RegEx& Space() {
- static const RegEx e = RegEx(' ');
- return e;
- }
- inline const RegEx& Tab() {
- static const RegEx e = RegEx('\t');
- return e;
- }
- inline const RegEx& Blank() {
- static const RegEx e = Space() | Tab();
- return e;
- }
- inline const RegEx& Break() {
- static const RegEx e = RegEx('\n') | RegEx("\r\n") | RegEx('\r');
- return e;
- }
- inline const RegEx& BlankOrBreak() {
- static const RegEx e = Blank() | Break();
- return e;
- }
- inline const RegEx& Digit() {
- static const RegEx e = RegEx('0', '9');
- return e;
- }
- inline const RegEx& Alpha() {
- static const RegEx e = RegEx('a', 'z') | RegEx('A', 'Z');
- return e;
- }
- inline const RegEx& AlphaNumeric() {
- static const RegEx e = Alpha() | Digit();
- return e;
- }
- inline const RegEx& Word() {
- static const RegEx e = AlphaNumeric() | RegEx('-');
- return e;
- }
- inline const RegEx& Hex() {
- static const RegEx e = Digit() | RegEx('A', 'F') | RegEx('a', 'f');
- return e;
- }
- // Valid Unicode code points that are not part of c-printable (YAML 1.2, sec.
- // 5.1)
- inline const RegEx& NotPrintable() {
- static const RegEx e =
- RegEx(0) |
- RegEx("\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x7F", REGEX_OR) |
- RegEx(0x0E, 0x1F) |
- (RegEx('\xC2') + (RegEx('\x80', '\x84') | RegEx('\x86', '\x9F')));
- return e;
- }
- inline const RegEx& Utf8_ByteOrderMark() {
- static const RegEx e = RegEx("\xEF\xBB\xBF");
- return e;
- }
- // actual tags
- inline const RegEx& DocStart() {
- static const RegEx e = RegEx("---") + (BlankOrBreak() | RegEx());
- return e;
- }
- inline const RegEx& DocEnd() {
- static const RegEx e = RegEx("...") + (BlankOrBreak() | RegEx());
- return e;
- }
- inline const RegEx& DocIndicator() {
- static const RegEx e = DocStart() | DocEnd();
- return e;
- }
- inline const RegEx& BlockEntry() {
- static const RegEx e = RegEx('-') + (BlankOrBreak() | RegEx());
- return e;
- }
- inline const RegEx& Key() {
- static const RegEx e = RegEx('?') + BlankOrBreak();
- return e;
- }
- inline const RegEx& KeyInFlow() {
- static const RegEx e = RegEx('?') + BlankOrBreak();
- return e;
- }
- inline const RegEx& Value() {
- static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx());
- return e;
- }
- inline const RegEx& ValueInFlow() {
- static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx(",]}", REGEX_OR));
- return e;
- }
- inline const RegEx& ValueInJSONFlow() {
- static const RegEx e = RegEx(':');
- return e;
- }
- inline const RegEx& Ampersand() {
- static const RegEx e = RegEx('&');
- return e;
- }
- inline const RegEx Comment() {
- static const RegEx e = RegEx('#');
- return e;
- }
- inline const RegEx& Anchor() {
- static const RegEx e = !(RegEx("[]{},", REGEX_OR) | BlankOrBreak());
- return e;
- }
- inline const RegEx& AnchorEnd() {
- static const RegEx e = RegEx("?:,]}%@`", REGEX_OR) | BlankOrBreak();
- return e;
- }
- inline const RegEx& URI() {
- static const RegEx e = Word() | RegEx("#;/?:@&=+$,_.!~*'()[]", REGEX_OR) |
- (RegEx('%') + Hex() + Hex());
- return e;
- }
- inline const RegEx& Tag() {
- static const RegEx e = Word() | RegEx("#;/?:@&=+$_.~*'()", REGEX_OR) |
- (RegEx('%') + Hex() + Hex());
- return e;
- }
- // Plain scalar rules:
- // . Cannot start with a blank.
- // . Can never start with any of , [ ] { } # & * ! | > \' \" % @ `
- // . In the block context - ? : must be not be followed with a space.
- // . In the flow context ? is illegal and : and - must not be followed with a
- // space.
- inline const RegEx& PlainScalar() {
- static const RegEx e =
- !(BlankOrBreak() | RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) |
- (RegEx("-?:", REGEX_OR) + (BlankOrBreak() | RegEx())));
- return e;
- }
- inline const RegEx& PlainScalarInFlow() {
- static const RegEx e =
- !(BlankOrBreak() | RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) |
- (RegEx("-:", REGEX_OR) + (Blank() | RegEx())));
- return e;
- }
- inline const RegEx& EndScalar() {
- static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx());
- return e;
- }
- inline const RegEx& EndScalarInFlow() {
- static const RegEx e =
- (RegEx(':') + (BlankOrBreak() | RegEx() | RegEx(",]}", REGEX_OR))) |
- RegEx(",?[]{}", REGEX_OR);
- return e;
- }
- inline const RegEx& ScanScalarEndInFlow() {
- static const RegEx e = (EndScalarInFlow() | (BlankOrBreak() + Comment()));
- return e;
- }
- inline const RegEx& ScanScalarEnd() {
- static const RegEx e = EndScalar() | (BlankOrBreak() + Comment());
- return e;
- }
- inline const RegEx& EscSingleQuote() {
- static const RegEx e = RegEx("\'\'");
- return e;
- }
- inline const RegEx& EscBreak() {
- static const RegEx e = RegEx('\\') + Break();
- return e;
- }
- inline const RegEx& ChompIndicator() {
- static const RegEx e = RegEx("+-", REGEX_OR);
- return e;
- }
- inline const RegEx& Chomp() {
- static const RegEx e = (ChompIndicator() + Digit()) |
- (Digit() + ChompIndicator()) | ChompIndicator() |
- Digit();
- return e;
- }
- // and some functions
- std::string Escape(Stream& in);
- } // namespace Exp
- namespace Keys {
- const char Directive = '%';
- const char FlowSeqStart = '[';
- const char FlowSeqEnd = ']';
- const char FlowMapStart = '{';
- const char FlowMapEnd = '}';
- const char FlowEntry = ',';
- const char Alias = '*';
- const char Anchor = '&';
- const char Tag = '!';
- const char LiteralScalar = '|';
- const char FoldedScalar = '>';
- const char VerbatimTagStart = '<';
- const char VerbatimTagEnd = '>';
- } // namespace Keys
- } // namespace YAML
- #endif // EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66
|