mirror of
https://github.com/loot/yaml-cpp.git
synced 2026-07-27 14:13:42 -07:00
Mostly finished refactoring the scalar scanning.
This commit is contained in:
+3
-3
@@ -11,10 +11,10 @@ namespace YAML
|
|||||||
class IllegalMapKey: public Exception {};
|
class IllegalMapKey: public Exception {};
|
||||||
class IllegalMapValue: public Exception {};
|
class IllegalMapValue: public Exception {};
|
||||||
class IllegalScalar: public Exception {};
|
class IllegalScalar: public Exception {};
|
||||||
class IllegalTabInScalar: public Exception {};
|
class IllegalTabInIndentation: public Exception {};
|
||||||
class IllegalFlowEnd: public Exception {};
|
class IllegalFlowEnd: public Exception {};
|
||||||
class DocIndicatorInQuote: public Exception {};
|
class IllegalDocIndicator: public Exception {};
|
||||||
class EOFInQuote: public Exception {};
|
class IllegalEOF: public Exception {};
|
||||||
class RequiredSimpleKeyNotFound: public Exception {};
|
class RequiredSimpleKeyNotFound: public Exception {};
|
||||||
class ZeroIndentationInBlockScalar: public Exception {};
|
class ZeroIndentationInBlockScalar: public Exception {};
|
||||||
class UnexpectedCharacterInBlockScalar: public Exception {};
|
class UnexpectedCharacterInBlockScalar: public Exception {};
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ namespace YAML
|
|||||||
|
|
||||||
const RegEx DocStart = RegEx("---") + (BlankOrBreak || RegEx(EOF) || RegEx());
|
const RegEx DocStart = RegEx("---") + (BlankOrBreak || RegEx(EOF) || RegEx());
|
||||||
const RegEx DocEnd = RegEx("...") + (BlankOrBreak || RegEx(EOF) || RegEx());
|
const RegEx DocEnd = RegEx("...") + (BlankOrBreak || RegEx(EOF) || RegEx());
|
||||||
|
const RegEx DocIndicator = DocStart || DocEnd;
|
||||||
const RegEx BlockEntry = RegEx('-') + (BlankOrBreak || RegEx(EOF));
|
const RegEx BlockEntry = RegEx('-') + (BlankOrBreak || RegEx(EOF));
|
||||||
const RegEx Key = RegEx('?'),
|
const RegEx Key = RegEx('?'),
|
||||||
KeyInFlow = RegEx('?') + BlankOrBreak;
|
KeyInFlow = RegEx('?') + BlankOrBreak;
|
||||||
|
|||||||
@@ -19,19 +19,20 @@ namespace YAML
|
|||||||
~Scanner();
|
~Scanner();
|
||||||
|
|
||||||
Token *GetNextToken();
|
Token *GetNextToken();
|
||||||
|
void Scan();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// scanning
|
||||||
void ScanNextToken();
|
void ScanNextToken();
|
||||||
void ScanToNextToken();
|
void ScanToNextToken();
|
||||||
Token *PushIndentTo(int column, bool sequence);
|
Token *PushIndentTo(int column, bool sequence);
|
||||||
void PopIndentTo(int column);
|
void PopIndentTo(int column);
|
||||||
|
|
||||||
|
// checking input
|
||||||
void InsertSimpleKey();
|
void InsertSimpleKey();
|
||||||
bool VerifySimpleKey();
|
bool VerifySimpleKey();
|
||||||
void VerifyAllSimpleKeys();
|
void VerifyAllSimpleKeys();
|
||||||
|
|
||||||
void Scan();
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool IsWhitespaceToBeEaten(char ch);
|
bool IsWhitespaceToBeEaten(char ch);
|
||||||
bool IsDocumentStart();
|
bool IsDocumentStart();
|
||||||
bool IsDocumentEnd();
|
bool IsDocumentEnd();
|
||||||
|
|||||||
+157
-342
File diff suppressed because it is too large
Load Diff
+11
-17
@@ -7,35 +7,29 @@
|
|||||||
namespace YAML
|
namespace YAML
|
||||||
{
|
{
|
||||||
enum CHOMP { STRIP = -1, CLIP, KEEP };
|
enum CHOMP { STRIP = -1, CLIP, KEEP };
|
||||||
|
enum ACTION { NONE, BREAK, THROW };
|
||||||
|
|
||||||
struct ScanScalarInfo {
|
struct ScanScalarInfo {
|
||||||
ScanScalarInfo(): eatEnd(false), indent(0), eatLeadingWhitespace(0), escape(0), fold(false), trimTrailingSpaces(0), chomp(CLIP) {}
|
ScanScalarInfo(): eatEnd(false), indent(0), detectIndent(false), eatLeadingWhitespace(0), escape(0), fold(false),
|
||||||
|
trimTrailingSpaces(0), chomp(CLIP), onDocIndicator(NONE), onTabInIndentation(NONE), leadingSpaces(false) {}
|
||||||
|
|
||||||
|
// input:
|
||||||
RegEx end; // what condition ends this scalar?
|
RegEx end; // what condition ends this scalar?
|
||||||
bool eatEnd; // should we eat that condition when we see it?
|
bool eatEnd; // should we eat that condition when we see it?
|
||||||
int indent; // what level of indentation should be eaten and ignored?
|
int indent; // what level of indentation should be eaten and ignored?
|
||||||
|
bool detectIndent; // should we try to autodetect the indent?
|
||||||
bool eatLeadingWhitespace; // should we continue eating this delicious indentation after 'indent' spaces?
|
bool eatLeadingWhitespace; // should we continue eating this delicious indentation after 'indent' spaces?
|
||||||
char escape; // what character do we escape on (i.e., slash or single quote) (0 for none)
|
char escape; // what character do we escape on (i.e., slash or single quote) (0 for none)
|
||||||
bool fold; // do we fold line ends?
|
bool fold; // do we fold line ends?
|
||||||
bool trimTrailingSpaces; // do we remove all trailing spaces (at the very end)
|
bool trimTrailingSpaces; // do we remove all trailing spaces (at the very end)
|
||||||
CHOMP chomp; // do we strip, clip, or keep trailing newlines (at the very end)
|
CHOMP chomp; // do we strip, clip, or keep trailing newlines (at the very end)
|
||||||
// Note: strip means kill all, clip means keep at most one, keep means keep all
|
// Note: strip means kill all, clip means keep at most one, keep means keep all
|
||||||
|
ACTION onDocIndicator; // what do we do if we see a document indicator?
|
||||||
|
ACTION onTabInIndentation; // what do we do if we see a tab where we should be seeing indentation spaces
|
||||||
|
|
||||||
|
// output:
|
||||||
|
bool leadingSpaces;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GetBlockIndentation(Stream& INPUT, int& indent, std::string& breaks, int topIndent);
|
std::string ScanScalar(Stream& INPUT, ScanScalarInfo& info);
|
||||||
std::string ScanScalar(Stream& INPUT, ScanScalarInfo info);
|
|
||||||
|
|
||||||
struct WhitespaceInfo {
|
|
||||||
WhitespaceInfo();
|
|
||||||
|
|
||||||
void SetChompers(char ch);
|
|
||||||
void AddBlank(char ch);
|
|
||||||
void AddBreak(const std::string& line);
|
|
||||||
std::string Join(bool lastline = false);
|
|
||||||
|
|
||||||
bool leadingBlanks;
|
|
||||||
bool fold;
|
|
||||||
std::string whitespace, leadingBreaks, trailingBreaks;
|
|
||||||
int chomp, increment;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
---
|
---
|
||||||
- "quoted scalar\twith a tab\nand a newline"
|
- here's a key: value
|
||||||
- 'This is Jesse''s single quote!'
|
here's the first block: |
|
||||||
- |
|
after the block: value
|
||||||
here's a literal:
|
and here's a block: |-
|
||||||
#include <iostream>
|
What's going on?
|
||||||
|
How are you doing?
|
||||||
int main()
|
Here's some code:
|
||||||
{
|
|
||||||
std::cout << "Hello World!\n";
|
#include <iostream>
|
||||||
return 0;
|
int main()
|
||||||
}
|
{
|
||||||
- key1: value1
|
std::cout << "Hello World!\n";
|
||||||
key2: value2
|
}
|
||||||
|
|
||||||
|
I'm doing fine!
|
||||||
|
and last key: value
|
||||||
Reference in New Issue
Block a user