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 &);
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();