| #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"); |
| 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 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())); |
| 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 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 = '>'; |
| } |
| } |
| |
| #endif // EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 |