Formatter();
+ virtual void apply(ProgramSyntax::Stage &);
const std::string &get_result() const { return formatted; }
virtual void visit(ProgramSyntax::Block &);
virtual void visit(ProgramSyntax::Literal &);
virtual void visit(ProgramSyntax::ExpressionStatement &);
virtual void visit(ProgramSyntax::Import &);
virtual void visit(ProgramSyntax::Layout &);
+ virtual void visit(ProgramSyntax::InterfaceLayout &);
virtual void visit(ProgramSyntax::StructDeclaration &);
virtual void visit(ProgramSyntax::VariableDeclaration &);
virtual void visit(ProgramSyntax::InterfaceBlock &);
virtual void visit(ProgramSyntax::InterfaceBlock &);
};
- struct InterfaceGenerator: Visitor
+ struct FunctionResolver: Visitor
+ {
+ std::map<std::string, std::vector<ProgramSyntax::FunctionDeclaration *> > functions;
+
+ virtual void visit(ProgramSyntax::FunctionCall &);
+ virtual void visit(ProgramSyntax::FunctionDeclaration &);
+ };
+
+ struct BlockModifier: Visitor
+ {
+ bool remove_node;
+ std::list<ProgramSyntax::Node *> insert_nodes;
+
+ BlockModifier();
+
+ void flatten_block(ProgramSyntax::Block &);
+ void apply_and_increment(ProgramSyntax::Block &, std::list<ProgramSyntax::NodePtr<ProgramSyntax::Node> >::iterator &);
+ virtual void visit(ProgramSyntax::Block &);
+ };
+
+ struct InterfaceGenerator: BlockModifier
{
std::string in_prefix;
std::string out_prefix;
unsigned scope_level;
std::map<std::string, ProgramSyntax::VariableDeclaration *> iface_declarations;
- bool remove_node;
- std::list<ProgramSyntax::Node *> insert_nodes;
InterfaceGenerator();
virtual void visit(ProgramSyntax::VariableDeclaration &);
};
+ struct ExpressionEvaluator: ProgramSyntax::NodeVisitor
+ {
+ typedef std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Expression *> ValueMap;
+
+ const ValueMap *variable_values;
+ float result;
+ bool result_valid;
+
+ ExpressionEvaluator();
+ ExpressionEvaluator(const ValueMap &);
+
+ virtual void visit(ProgramSyntax::Literal &);
+ virtual void visit(ProgramSyntax::ParenthesizedExpression &);
+ virtual void visit(ProgramSyntax::VariableReference &);
+ virtual void visit(ProgramSyntax::UnaryExpression &);
+ virtual void visit(ProgramSyntax::BinaryExpression &);
+ };
+
+ struct ConstantConditionEliminator: BlockModifier
+ {
+ unsigned scope_level;
+ ExpressionEvaluator::ValueMap variable_values;
+
+ ConstantConditionEliminator();
+
+ virtual void visit(ProgramSyntax::Block &);
+ virtual void visit(ProgramSyntax::Assignment &);
+ virtual void visit(ProgramSyntax::VariableDeclaration &);
+ virtual void visit(ProgramSyntax::Conditional &);
+ virtual void visit(ProgramSyntax::Iteration &);
+ };
+
struct UnusedVariableLocator: Visitor
{
struct AssignmentList
virtual void visit(ProgramSyntax::Iteration &);
};
+ struct UnusedFunctionLocator: Visitor
+ {
+ typedef std::set<ProgramSyntax::Node *> ResultType;
+
+ std::set<ProgramSyntax::Node *> unused_nodes;
+ std::set<ProgramSyntax::FunctionDeclaration *> used_definitions;
+
+ const ResultType &get_result() const { return unused_nodes; }
+ virtual void visit(ProgramSyntax::FunctionCall &);
+ virtual void visit(ProgramSyntax::FunctionDeclaration &);
+ };
+
struct NodeRemover: Visitor
{
std::set<ProgramSyntax::Node *> to_remove;
virtual void visit(ProgramSyntax::VariableDeclaration &);
};
+ struct LegacyConverter: BlockModifier
+ {
+ Version target_version;
+ std::string type;
+ std::string frag_out_name;
+
+ LegacyConverter();
+ LegacyConverter(const Version &);
+
+ bool check_version(const Version &);
+ virtual void visit(ProgramSyntax::VariableReference &);
+ virtual void visit(ProgramSyntax::FunctionCall &);
+ virtual void visit(ProgramSyntax::VariableDeclaration &);
+ virtual void visit(ProgramSyntax::InterfaceBlock &);
+ };
+
Resources *resources;
ProgramParser parser;
ProgramSyntax::Module *module;