"...resnet50_tensorflow.git" did not exist on "57e29a004e13e2eabb3d7fb33ac8bcf12eac73a8"
parser.cpp 2.95 KB
Newer Older
Jesse Beder's avatar
Jesse Beder committed
1
2
3
4
#include <cstdio>
#include <sstream>

#include "directives.h"  // IWYU pragma: keep
Jesse Beder's avatar
Jesse Beder committed
5
#include "scanner.h"     // IWYU pragma: keep
6
#include "singledocparser.h"
7
#include "token.h"
Jesse Beder's avatar
Jesse Beder committed
8
9
#include "yaml-cpp/exceptions.h"  // IWYU pragma: keep
#include "yaml-cpp/parser.h"
10

Jesse Beder's avatar
Jesse Beder committed
11
namespace YAML {
Jesse Beder's avatar
Jesse Beder committed
12
13
class EventHandler;

14
Parser::Parser() : m_pScanner{}, m_pDirectives{} {}
Jesse Beder's avatar
Jesse Beder committed
15

16
Parser::Parser(std::istream& in) : Parser() { Load(in); }
Jesse Beder's avatar
Jesse Beder committed
17

18
Parser::~Parser() = default;
Jesse Beder's avatar
Jesse Beder committed
19
20

Parser::operator bool() const {
21
  return m_pScanner && !m_pScanner->empty();
Jesse Beder's avatar
Jesse Beder committed
22
23
24
25
26
27
28
29
}

void Parser::Load(std::istream& in) {
  m_pScanner.reset(new Scanner(in));
  m_pDirectives.reset(new Directives);
}

bool Parser::HandleNextDocument(EventHandler& eventHandler) {
30
  if (!m_pScanner)
Jesse Beder's avatar
Jesse Beder committed
31
32
33
    return false;

  ParseDirectives();
34
  if (m_pScanner->empty()) {
Jesse Beder's avatar
Jesse Beder committed
35
    return false;
36
  }
Jesse Beder's avatar
Jesse Beder committed
37
38
39
40
41
42
43
44
45

  SingleDocParser sdp(*m_pScanner, *m_pDirectives);
  sdp.HandleDocument(eventHandler);
  return true;
}

void Parser::ParseDirectives() {
  bool readDirective = false;

46
  while (!m_pScanner->empty()) {
Jesse Beder's avatar
Jesse Beder committed
47
    Token& token = m_pScanner->peek();
48
    if (token.type != Token::DIRECTIVE) {
Jesse Beder's avatar
Jesse Beder committed
49
      break;
50
    }
Jesse Beder's avatar
Jesse Beder committed
51
52
53

    // we keep the directives from the last document if none are specified;
    // but if any directives are specific, then we reset them
54
    if (!readDirective) {
Jesse Beder's avatar
Jesse Beder committed
55
      m_pDirectives.reset(new Directives);
56
    }
Jesse Beder's avatar
Jesse Beder committed
57
58
59
60
61
62
63
64

    readDirective = true;
    HandleDirective(token);
    m_pScanner->pop();
  }
}

void Parser::HandleDirective(const Token& token) {
65
  if (token.value == "YAML") {
Jesse Beder's avatar
Jesse Beder committed
66
    HandleYamlDirective(token);
67
  } else if (token.value == "TAG") {
Jesse Beder's avatar
Jesse Beder committed
68
    HandleTagDirective(token);
69
  }
Jesse Beder's avatar
Jesse Beder committed
70
71
72
}

void Parser::HandleYamlDirective(const Token& token) {
73
  if (token.params.size() != 1) {
Jesse Beder's avatar
Jesse Beder committed
74
    throw ParserException(token.mark, ErrorMsg::YAML_DIRECTIVE_ARGS);
75
  }
Jesse Beder's avatar
Jesse Beder committed
76

77
  if (!m_pDirectives->version.isDefault) {
Jesse Beder's avatar
Jesse Beder committed
78
    throw ParserException(token.mark, ErrorMsg::REPEATED_YAML_DIRECTIVE);
79
  }
Jesse Beder's avatar
Jesse Beder committed
80
81
82
83
84

  std::stringstream str(token.params[0]);
  str >> m_pDirectives->version.major;
  str.get();
  str >> m_pDirectives->version.minor;
85
  if (!str || str.peek() != EOF) {
Jesse Beder's avatar
Jesse Beder committed
86
87
    throw ParserException(
        token.mark, std::string(ErrorMsg::YAML_VERSION) + token.params[0]);
88
  }
Jesse Beder's avatar
Jesse Beder committed
89

90
  if (m_pDirectives->version.major > 1) {
Jesse Beder's avatar
Jesse Beder committed
91
    throw ParserException(token.mark, ErrorMsg::YAML_MAJOR_VERSION);
92
  }
Jesse Beder's avatar
Jesse Beder committed
93
94
95
96
97
98
99
100
101
102
103

  m_pDirectives->version.isDefault = false;
  // TODO: warning on major == 1, minor > 2?
}

void Parser::HandleTagDirective(const Token& token) {
  if (token.params.size() != 2)
    throw ParserException(token.mark, ErrorMsg::TAG_DIRECTIVE_ARGS);

  const std::string& handle = token.params[0];
  const std::string& prefix = token.params[1];
104
  if (m_pDirectives->tags.find(handle) != m_pDirectives->tags.end()) {
Jesse Beder's avatar
Jesse Beder committed
105
    throw ParserException(token.mark, ErrorMsg::REPEATED_TAG_DIRECTIVE);
106
  }
Jesse Beder's avatar
Jesse Beder committed
107
108
109
110
111

  m_pDirectives->tags[handle] = prefix;
}

void Parser::PrintTokens(std::ostream& out) {
112
  if (!m_pScanner) {
Jesse Beder's avatar
Jesse Beder committed
113
    return;
114
  }
Jesse Beder's avatar
Jesse Beder committed
115

116
  while (!m_pScanner->empty()) {
Jesse Beder's avatar
Jesse Beder committed
117
118
119
120
    out << m_pScanner->peek() << "\n";
    m_pScanner->pop();
  }
}
121
}  // namespace YAML