+#include <msp/core/maputils.h>
#include "syntax.h"
#include "visitor.h"
const Operator Operator::operators[] =
{
{ "[", 2, BINARY, LEFT_TO_RIGHT },
- { "(", 2, BINARY, LEFT_TO_RIGHT },
+ { "(", 2, POSTFIX, LEFT_TO_RIGHT },
{ ".", 2, BINARY, LEFT_TO_RIGHT },
{ "++", 2, POSTFIX, LEFT_TO_RIGHT },
{ "--", 2, POSTFIX, LEFT_TO_RIGHT },
{ "-", 3, PREFIX, RIGHT_TO_LEFT },
{ "~", 3, PREFIX, RIGHT_TO_LEFT },
{ "!", 3, PREFIX, RIGHT_TO_LEFT },
- { "*", 4, BINARY, LEFT_TO_RIGHT },
+ { "*", 4, BINARY, ASSOCIATIVE },
{ "/", 4, BINARY, LEFT_TO_RIGHT },
{ "%", 4, BINARY, LEFT_TO_RIGHT },
- { "+", 5, BINARY, LEFT_TO_RIGHT },
+ { "+", 5, BINARY, ASSOCIATIVE },
{ "-", 5, BINARY, LEFT_TO_RIGHT },
{ "<<", 6, BINARY, LEFT_TO_RIGHT },
{ ">>", 6, BINARY, LEFT_TO_RIGHT },
{ ">=", 7, BINARY, LEFT_TO_RIGHT },
{ "==", 8, BINARY, LEFT_TO_RIGHT },
{ "!=", 8, BINARY, LEFT_TO_RIGHT },
- { "&", 9, BINARY, LEFT_TO_RIGHT },
- { "^", 10, BINARY, LEFT_TO_RIGHT },
- { "|", 11, BINARY, LEFT_TO_RIGHT },
- { "&&", 12, BINARY, LEFT_TO_RIGHT },
- { "^^", 13, BINARY, LEFT_TO_RIGHT },
- { "||", 14, BINARY, LEFT_TO_RIGHT },
+ { "&", 9, BINARY, ASSOCIATIVE },
+ { "^", 10, BINARY, ASSOCIATIVE },
+ { "|", 11, BINARY, ASSOCIATIVE },
+ { "&&", 12, BINARY, ASSOCIATIVE },
+ { "^^", 13, BINARY, ASSOCIATIVE },
+ { "||", 14, BINARY, ASSOCIATIVE },
{ "?", 15, BINARY, RIGHT_TO_LEFT },
{ ":", 15, BINARY, RIGHT_TO_LEFT },
{ "=", 16, BINARY, RIGHT_TO_LEFT },
{ { 0 }, 18, NO_OPERATOR, LEFT_TO_RIGHT }
};
+const Operator &Operator::get_operator(const string &token, Type type)
+{
+ for(const Operator *i=operators; i->type; ++i)
+ if(i->type==type && i->token==token)
+ return *i;
+ throw key_error(token);
+}
+
template<typename C>
NodeContainer<C>::NodeContainer(const NodeContainer &c):
}
-Statement::Statement():
- source(GENERATED_SOURCE),
- line(1)
-{ }
-
-
Block::Block():
use_braces(false),
parent(0)
}
+Expression::Expression():
+ oper(0),
+ type(0),
+ lvalue(false)
+{ }
+
+
void Literal::visit(NodeVisitor &visitor)
{
visitor.visit(*this);
}
-UnaryExpression::UnaryExpression():
- prefix(true)
-{ }
-
void UnaryExpression::visit(NodeVisitor &visitor)
{
visitor.visit(*this);
}
+BasicTypeDeclaration::BasicTypeDeclaration():
+ kind(ALIAS),
+ size(0),
+ base_type(0)
+{ }
+
+BasicTypeDeclaration::BasicTypeDeclaration(const BasicTypeDeclaration &other):
+ TypeDeclaration(other),
+ kind(other.kind),
+ size(other.size),
+ base(other.base),
+ base_type(0)
+{ }
+
+void BasicTypeDeclaration::visit(NodeVisitor &visitor)
+{
+ visitor.visit(*this);
+}
+
+
+ImageTypeDeclaration::ImageTypeDeclaration():
+ dimensions(TWO),
+ array(false),
+ sampled(true),
+ shadow(false)
+{ }
+
+void ImageTypeDeclaration::visit(NodeVisitor &visitor)
+{
+ visitor.visit(*this);
+}
+
+
StructDeclaration::StructDeclaration()
{
members.use_braces = true;
FunctionDeclaration::FunctionDeclaration():
- definition(0)
+ definition(0),
+ return_type_declaration(0)
{ }
FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration &other):
name(other.name),
parameters(other.parameters),
body(other.body),
- definition(other.definition==&other ? this : 0)
+ definition(other.definition==&other ? this : 0),
+ return_type_declaration(0)
{ }
void FunctionDeclaration::visit(NodeVisitor &visitor)