+#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(0),
- 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);
{ }
VariableReference::VariableReference(const VariableReference &other):
+ Expression(other),
name(other.name),
declaration(0)
{ }
{ }
InterfaceBlockReference::InterfaceBlockReference(const InterfaceBlockReference &other):
+ Expression(other),
name(other.name),
declaration(0)
{ }
{ }
MemberAccess::MemberAccess(const MemberAccess &other):
+ Expression(other),
left(other.left),
member(other.member),
declaration(0)
}
-UnaryExpression::UnaryExpression():
- prefix(true)
-{ }
-
void UnaryExpression::visit(NodeVisitor &visitor)
{
visitor.visit(*this);
{ }
Assignment::Assignment(const Assignment &other):
+ BinaryExpression(other),
self_referencing(other.self_referencing),
target_declaration(0)
{ }
FunctionCall::FunctionCall():
- declaration(0),
- constructor(false)
+ constructor(false),
+ declaration(0)
{ }
FunctionCall::FunctionCall(const FunctionCall &other):
+ Expression(other),
name(other.name),
- declaration(0),
constructor(other.constructor),
- arguments(other.arguments)
+ arguments(other.arguments),
+ declaration(0)
{ }
void FunctionCall::visit(NodeVisitor &visitor)
}
+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;
VariableDeclaration::VariableDeclaration():
constant(false),
- type_declaration(0),
array(false),
+ type_declaration(0),
linked_declaration(0)
{ }
VariableDeclaration::VariableDeclaration(const VariableDeclaration &other):
+ Statement(other),
+ layout(other.layout),
constant(other.constant),
sampling(other.sampling),
interpolation(other.interpolation),
interface(other.interface),
precision(other.precision),
type(other.type),
- type_declaration(0),
name(other.name),
array(other.array),
array_size(other.array_size),
init_expression(other.init_expression),
- linked_declaration(0),
- layout(other.layout)
+ type_declaration(0),
+ linked_declaration(0)
{ }
VariableDeclaration::~VariableDeclaration()
}
InterfaceBlock::InterfaceBlock(const InterfaceBlock &other):
+ Statement(other),
interface(other.interface),
name(other.name),
members(other.members),
FunctionDeclaration::FunctionDeclaration():
- definition(0)
+ definition(0),
+ return_type_declaration(0)
{ }
FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration &other):
+ Statement(other),
return_type(other.return_type),
name(other.name),
parameters(other.parameters),
+ body(other.body),
definition(other.definition==&other ? this : 0),
- body(other.body)
+ return_type_declaration(0)
{ }
void FunctionDeclaration::visit(NodeVisitor &visitor)