00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __CLASSAD_SOURCE_H__
00022 #define __CLASSAD_SOURCE_H__
00023
00024 #include <vector>
00025 #include <iosfwd>
00026 #include "classad/lexer.h"
00027
00028 BEGIN_NAMESPACE( classad )
00029
00030 class ClassAd;
00031 class ExprTree;
00032 class ExprList;
00033 class FunctionCall;
00034
00037 class ClassAdParser
00038 {
00039 public:
00041 ClassAdParser();
00042
00044 ~ClassAdParser();
00045
00055 ClassAd *ParseClassAd(const std::string &buffer, bool full=false);
00056 ClassAd *ParseClassAd(const std::string &buffer, int &offset);
00057 ClassAd *ParseClassAd(const char *buffer, bool full=false);
00058 ClassAd *ParseClassAd(const char *buffer, int &offset);
00059 ClassAd *ParseClassAd(FILE *file, bool full=false);
00060 ClassAd *ParseClassAd(std::istream &stream, bool full=false);
00061
00062 ClassAd *ParseClassAd(LexerSource *lexer_source, bool full=false);
00063
00073 bool ParseClassAd(const std::string &buffer, ClassAd &ad, bool full=false);
00074 bool ParseClassAd(const std::string &buffer, ClassAd &classad, int &offset);
00075 bool ParseClassAd(const char *buffer, ClassAd &classad, bool full=false);
00076 bool ParseClassAd(const char *buffer, ClassAd &classad, int &offset);
00077 bool ParseClassAd(FILE *file, ClassAd &classad, bool full=false);
00078 bool ParseClassAd(std::istream &stream, ClassAd &classad, bool full=false);
00079
00080 bool ParseClassAd(LexerSource *lexer_source, ClassAd &ad, bool full=false);
00081
00091 bool ParseExpression( const std::string &buffer, ExprTree*& expr,
00092 bool full=false);
00093
00094 bool ParseExpression( LexerSource *lexer_source, ExprTree*& expr,
00095 bool full=false);
00096
00106 ExprTree *ParseExpression( const std::string &buffer, bool full=false);
00107
00108 ExprTree *ParseExpression( LexerSource *lexer_source, bool full=false);
00109
00110 ExprTree *ParseNextExpression(void);
00111
00112 void SetDebug( bool d ) { lexer.SetDebug( d ); }
00113
00114 Lexer::TokenType PeekToken(void);
00115 Lexer::TokenType ConsumeToken(void);
00116
00117 private:
00118
00119 Lexer lexer;
00120
00121
00122 bool parseExpression( ExprTree*&, bool=false);
00123 bool parseClassAd( ClassAd&, bool=false);
00124 bool parseExprList( ExprList*&, bool=false);
00125 bool parseLogicalORExpression( ExprTree*& );
00126 bool parseLogicalANDExpression( ExprTree*& );
00127 bool parseInclusiveORExpression( ExprTree*& );
00128 bool parseExclusiveORExpression( ExprTree*& );
00129 bool parseANDExpression( ExprTree*& );
00130 bool parseEqualityExpression( ExprTree*& );
00131 bool parseRelationalExpression( ExprTree*& );
00132 bool parseShiftExpression( ExprTree*& );
00133 bool parseAdditiveExpression( ExprTree*& );
00134 bool parseMultiplicativeExpression( ExprTree*& );
00135 bool parseUnaryExpression( ExprTree*& );
00136 bool parsePostfixExpression( ExprTree*& );
00137 bool parsePrimaryExpression( ExprTree*& );
00138 bool parseArgumentList( std::vector<ExprTree*>& );
00139
00140 bool shouldEvaluateAtParseTime(const std::string &functionName,
00141 std::vector<ExprTree*> &argList);
00142 ExprTree *evaluateFunction(const std::string &functionName,
00143 std::vector<ExprTree*> &argList);
00144
00145 };
00146
00147 std::istream & operator>>(std::istream &stream, ClassAd &ad);
00148
00149 END_NAMESPACE
00150
00151 #endif//__CLASSAD_SOURCE_H__