]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programparser.h
Implement an actual expression parser
[libs/gl.git] / source / programparser.h
index 0a91c500b1a24884401614d7188953a77ae809a8..4bd6b70e99e1b9e2064eb9de9416a253ae5286bc 100644 (file)
@@ -13,12 +13,36 @@ namespace GL {
 class ProgramParser
 {
 private:
+       enum OperatorType
+       {
+               NO_OPERATOR,
+               BINARY,
+               PREFIX,
+               POSTFIX
+       };
+
+       enum Associativity
+       {
+               LEFT_TO_RIGHT,
+               RIGHT_TO_LEFT
+       };
+
+       struct Operator
+       {
+               const char token[4];
+               unsigned precedence;
+               OperatorType type;
+               Associativity assoc;
+       };
+
        std::string source;
        std::string::const_iterator iter;
        std::deque<std::string> next_tokens;
        ProgramSyntax::Module main_module;
        ProgramSyntax::Module *cur_module;
 
+       static Operator operators[];
+
 public:
        ProgramSyntax::Module &parse(const std::string &);
        ProgramSyntax::Module &parse(IO::Base &);
@@ -43,12 +67,15 @@ private:
        static bool is_qualifier(const std::string &);
        static bool is_builtin_type(const std::string &);
        bool is_type(const std::string &);
+       bool is_identifier(const std::string &);
 
        ProgramSyntax::Node *parse_global_declaration();
        ProgramSyntax::Node *parse_statement();
        ProgramSyntax::Layout *parse_layout();
        void parse_block(ProgramSyntax::Block &, bool);
-       void parse_expression(ProgramSyntax::Expression &);
+       ProgramSyntax::Expression *parse_expression(unsigned = 0);
+       ProgramSyntax::BinaryExpression *parse_binary(ProgramSyntax::Expression *, const Operator *);
+       ProgramSyntax::FunctionCall *parse_function_call(ProgramSyntax::VariableReference *);
        ProgramSyntax::StructDeclaration *parse_struct_declaration();
        ProgramSyntax::VariableDeclaration *parse_variable_declaration();
        ProgramSyntax::FunctionDeclaration *parse_function_declaration();