summaryrefslogtreecommitdiffstats
path: root/src/parsers.h
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2010-12-05 00:09:50 (GMT)
committerEvan Martin <martine@danga.com>2010-12-05 00:09:50 (GMT)
commit42d237e7841679b27cd5dcae82d143d86a87a807 (patch)
tree253b0cf88ecf3b0404146a7c7945dd4c660afa04 /src/parsers.h
parentd0025e234cf3fc0a13f45d179880578285609b59 (diff)
downloadNinja-42d237e7841679b27cd5dcae82d143d86a87a807.zip
Ninja-42d237e7841679b27cd5dcae82d143d86a87a807.tar.gz
Ninja-42d237e7841679b27cd5dcae82d143d86a87a807.tar.bz2
move src into subdir
Diffstat (limited to 'src/parsers.h')
-rw-r--r--src/parsers.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/parsers.h b/src/parsers.h
new file mode 100644
index 0000000..fc20436
--- /dev/null
+++ b/src/parsers.h
@@ -0,0 +1,101 @@
+#ifndef NINJA_PARSERS_H_
+#define NINJA_PARSERS_H_
+
+#include <string>
+#include <vector>
+
+using namespace std;
+
+struct BindingEnv;
+
+struct Token {
+ enum Type {
+ NONE,
+ UNKNOWN,
+ IDENT,
+ RULE,
+ BUILD,
+ SUBNINJA,
+ NEWLINE,
+ EQUALS,
+ COLON,
+ PIPE,
+ INDENT,
+ OUTDENT,
+ TEOF
+ };
+ explicit Token(Type type) : type_(type) {}
+
+ void Clear() { type_ = NONE; extra_.clear(); }
+ string AsString() const;
+
+ Type type_;
+ const char* pos_;
+ string extra_;
+};
+
+struct Tokenizer {
+ Tokenizer()
+ : token_(Token::NONE), line_number_(1),
+ last_indent_(0), cur_indent_(-1) {}
+
+ void Start(const char* start, const char* end);
+ bool Error(const string& message, string* err);
+
+ const Token& token() const { return token_; }
+
+ void SkipWhitespace(bool newline=false);
+ bool Newline(string* err);
+ bool ExpectToken(Token::Type expected, string* err);
+ bool ReadIdent(string* out);
+ bool ReadToNewline(string* text, string* err);
+
+ Token::Type PeekToken();
+ void ConsumeToken();
+
+ const char* cur_;
+ const char* end_;
+
+ const char* cur_line_;
+ Token token_;
+ int line_number_;
+ int last_indent_, cur_indent_;
+};
+
+struct MakefileParser {
+ bool Parse(const string& input, string* err);
+
+ Tokenizer tokenizer_;
+ string out_;
+ vector<string> ins_;
+};
+
+struct State;
+
+struct ManifestParser {
+ struct FileReader {
+ virtual bool ReadFile(const string& path, string* content, string* err) = 0;
+ };
+
+ ManifestParser(State* state, FileReader* file_reader);
+ void set_root(const string& root) { root_ = root; }
+
+ bool Load(const string& filename, string* err);
+ bool Parse(const string& input, string* err);
+
+ bool ParseRule(string* err);
+ bool ParseLet(string* key, string* val, string* err);
+ bool ParseEdge(string* err);
+ bool ParseSubNinja(string* err);
+
+ string ExpandFile(const string& file);
+
+ State* state_;
+ BindingEnv* env_;
+ FileReader* file_reader_;
+ Tokenizer tokenizer_;
+ string builddir_;
+ string root_; // Absolute path to root ninja file.
+};
+
+#endif // NINJA_PARSERS_H_