+#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),
+ source(GENERATED_SOURCE),
line(1)
{ }
}
+Expression::Expression():
+ oper(0)
+{ }
+
+
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(const FunctionCall &other):
+ Expression(other),
name(other.name),
constructor(other.constructor),
arguments(other.arguments),
{ }
VariableDeclaration::VariableDeclaration(const VariableDeclaration &other):
+ Statement(other),
layout(other.layout),
constant(other.constant),
sampling(other.sampling),
}
InterfaceBlock::InterfaceBlock(const InterfaceBlock &other):
+ Statement(other),
interface(other.interface),
name(other.name),
members(other.members),
{ }
FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration &other):
+ Statement(other),
return_type(other.return_type),
name(other.name),
parameters(other.parameters),