X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramparser.h;h=390f19cbdf921a24ca6c2a6f00adcb76d7c9cce9;hb=a36992487d018d8801ead6980b362b00a2f5f5c5;hp=0a91c500b1a24884401614d7188953a77ae809a8;hpb=6e6ee01b68056b23c6709d7f60396710dd7623b9;p=libs%2Fgl.git diff --git a/source/programparser.h b/source/programparser.h index 0a91c500..390f19cb 100644 --- a/source/programparser.h +++ b/source/programparser.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include "programsyntax.h" @@ -13,11 +14,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 next_tokens; ProgramSyntax::Module main_module; ProgramSyntax::Module *cur_module; + std::set declared_types; + + static Operator operators[]; public: ProgramSyntax::Module &parse(const std::string &); @@ -43,12 +69,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();