scantag.cpp
Go to the documentation of this file.
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 


libpointmatcher
Author(s):
autogenerated on Mon Sep 14 2015 02:59:06