X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fsyntax.cpp;h=cb77419763645be5987842b9bd7d654eb30e13c5;hb=041ba4b1acd55337239c5ce24cc310118c621206;hp=55dc94a77ff3552dbc449ade8da8659e3c1b9880;hpb=9ec831710f64a62ad5f2e896a55ae82a3519f29e;p=libs%2Fgl.git diff --git a/source/glsl/syntax.cpp b/source/glsl/syntax.cpp index 55dc94a7..cb774197 100644 --- a/source/glsl/syntax.cpp +++ b/source/glsl/syntax.cpp @@ -1,3 +1,4 @@ +#include #include "syntax.h" #include "visitor.h" @@ -10,7 +11,7 @@ namespace SL { 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 }, @@ -20,10 +21,10 @@ const Operator Operator::operators[] = { "-", 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 }, @@ -33,12 +34,12 @@ const Operator Operator::operators[] = { ">=", 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 }, @@ -56,6 +57,14 @@ const Operator Operator::operators[] = { { 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 NodeContainer::NodeContainer(const NodeContainer &c): @@ -66,12 +75,6 @@ NodeContainer::NodeContainer(const NodeContainer &c): } -Statement::Statement(): - source(GENERATED_SOURCE), - line(1) -{ } - - Block::Block(): use_braces(false), parent(0) @@ -90,6 +93,13 @@ void Block::visit(NodeVisitor &visitor) } +Expression::Expression(): + oper(0), + type(0), + lvalue(false) +{ } + + void Literal::visit(NodeVisitor &visitor) { visitor.visit(*this); @@ -107,6 +117,7 @@ VariableReference::VariableReference(): { } VariableReference::VariableReference(const VariableReference &other): + Expression(other), name(other.name), declaration(0) { } @@ -122,6 +133,7 @@ InterfaceBlockReference::InterfaceBlockReference(): { } InterfaceBlockReference::InterfaceBlockReference(const InterfaceBlockReference &other): + Expression(other), name(other.name), declaration(0) { } @@ -137,6 +149,7 @@ MemberAccess::MemberAccess(): { } MemberAccess::MemberAccess(const MemberAccess &other): + Expression(other), left(other.left), member(other.member), declaration(0) @@ -148,10 +161,6 @@ void MemberAccess::visit(NodeVisitor &visitor) } -UnaryExpression::UnaryExpression(): - prefix(true) -{ } - void UnaryExpression::visit(NodeVisitor &visitor) { visitor.visit(*this); @@ -170,6 +179,7 @@ Assignment::Assignment(): { } Assignment::Assignment(const Assignment &other): + BinaryExpression(other), self_referencing(other.self_referencing), target_declaration(0) { } @@ -186,6 +196,7 @@ FunctionCall::FunctionCall(): { } FunctionCall::FunctionCall(const FunctionCall &other): + Expression(other), name(other.name), constructor(other.constructor), arguments(other.arguments), @@ -228,11 +239,57 @@ void InterfaceLayout::visit(NodeVisitor &visitor) } -StructDeclaration::StructDeclaration() +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(): + interface_block(0) { members.use_braces = true; } +StructDeclaration::StructDeclaration(const StructDeclaration &other): + TypeDeclaration(other), + members(other.members), + interface_block(0) +{ } + +StructDeclaration::~StructDeclaration() +{ + if(interface_block && interface_block->struct_declaration==this) + interface_block->struct_declaration = 0; +} + void StructDeclaration::visit(NodeVisitor &visitor) { visitor.visit(*this); @@ -247,6 +304,7 @@ VariableDeclaration::VariableDeclaration(): { } VariableDeclaration::VariableDeclaration(const VariableDeclaration &other): + Statement(other), layout(other.layout), constant(other.constant), sampling(other.sampling), @@ -276,17 +334,20 @@ void VariableDeclaration::visit(NodeVisitor &visitor) InterfaceBlock::InterfaceBlock(): array(false), + type_declaration(0), + struct_declaration(0), linked_block(0) -{ - members.use_braces = true; -} +{ } InterfaceBlock::InterfaceBlock(const InterfaceBlock &other): + Statement(other), interface(other.interface), name(other.name), members(other.members), instance_name(other.instance_name), array(other.array), + type_declaration(0), + struct_declaration(0), linked_block(0) { } @@ -294,6 +355,8 @@ InterfaceBlock::~InterfaceBlock() { if(linked_block && linked_block->linked_block==this) linked_block->linked_block = 0; + if(struct_declaration && struct_declaration->interface_block==this) + struct_declaration->interface_block = 0; } void InterfaceBlock::visit(NodeVisitor &visitor) @@ -303,15 +366,18 @@ void InterfaceBlock::visit(NodeVisitor &visitor) 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) + definition(other.definition==&other ? this : 0), + return_type_declaration(0) { } void FunctionDeclaration::visit(NodeVisitor &visitor)