00001 #include "scanner.h" 00002 #include "regex.h" 00003 #include "exp.h" 00004 #include "yaml-cpp-pm/exceptions.h" 00005 00006 namespace YAML_PM 00007 { 00008 const std::string ScanVerbatimTag(Stream& INPUT) 00009 { 00010 std::string tag; 00011 00012 // eat the start character 00013 INPUT.get(); 00014 00015 while(INPUT) { 00016 if(INPUT.peek() == Keys::VerbatimTagEnd) { 00017 // eat the end character 00018 INPUT.get(); 00019 return tag; 00020 } 00021 00022 int n = Exp::URI().Match(INPUT); 00023 if(n <= 0) 00024 break; 00025 00026 tag += INPUT.get(n); 00027 } 00028 00029 throw ParserException(INPUT.mark(), ErrorMsg::END_OF_VERBATIM_TAG); 00030 } 00031 00032 const std::string ScanTagHandle(Stream& INPUT, bool& canBeHandle) 00033 { 00034 std::string tag; 00035 canBeHandle = true; 00036 Mark firstNonWordChar; 00037 00038 while(INPUT) { 00039 if(INPUT.peek() == Keys::Tag) { 00040 if(!canBeHandle) 00041 throw ParserException(firstNonWordChar, ErrorMsg::CHAR_IN_TAG_HANDLE); 00042 break; 00043 } 00044 00045 int n = 0; 00046 if(canBeHandle) { 00047 n = Exp::Word().Match(INPUT); 00048 if(n <= 0) { 00049 canBeHandle = false; 00050 firstNonWordChar = INPUT.mark(); 00051 } 00052 } 00053 00054 if(!canBeHandle) 00055 n = Exp::Tag().Match(INPUT); 00056 00057 if(n <= 0) 00058 break; 00059 00060 tag += INPUT.get(n); 00061 } 00062 00063 return tag; 00064 } 00065 00066 const std::string ScanTagSuffix(Stream& INPUT) 00067 { 00068 std::string tag; 00069 00070 while(INPUT) { 00071 int n = Exp::Tag().Match(INPUT); 00072 if(n <= 0) 00073 break; 00074 00075 tag += INPUT.get(n); 00076 } 00077 00078 if(tag.empty()) 00079 throw ParserException(INPUT.mark(), ErrorMsg::TAG_WITH_NO_SUFFIX); 00080 00081 return tag; 00082 } 00083 } 00084