00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef avro_Compiler_hh__
00020 #define avro_Compiler_hh__
00021
00022 #include "Boost.hh"
00023
00024 #include <FlexLexer.h>
00025 #include "Types.hh"
00026 #include "Node.hh"
00027 #include "CompilerNode.hh"
00028
00029 namespace avro {
00030
00035
00036 class CompilerContext {
00037
00038
00039 public:
00040
00041 CompilerContext(std::istream &is) :
00042 lexer_(&is)
00043 {}
00044
00047 void setText(const char *text) {
00048 text_ = text;
00049 }
00050
00051 void addNamedType();
00052
00053 void startType();
00054 void stopType();
00055
00056 void addType(avro::Type type);
00057
00058 void setSizeAttribute();
00059 void setNameAttribute();
00060 void setSymbolsAttribute();
00061
00062 void setFieldsAttribute();
00063 void setItemsAttribute();
00064 void setValuesAttribute();
00065 void setTypesAttribute();
00066
00067 void textContainsFieldName();
00068
00069 const FlexLexer &lexer() const {
00070 return lexer_;
00071 }
00072 FlexLexer &lexer() {
00073 return lexer_;
00074 }
00075
00076 const NodePtr &getRoot() const {
00077 return root_;
00078 }
00079
00080 private:
00081
00082 typedef boost::ptr_vector<CompilerNode> Stack;
00083
00084 void add(const NodePtr &node);
00085
00086 yyFlexLexer lexer_;
00087 std::string text_;
00088
00089 NodePtr root_;
00090 Stack stack_;
00091 };
00092
00093 class ValidSchema;
00094
00098
00099 void compileJsonSchema(std::istream &is, ValidSchema &schema);
00100
00105
00106 bool compileJsonSchema(std::istream &is, ValidSchema &schema, std::string &error);
00107
00108 }
00109
00110 #endif