Create AST nodes for qualified GLSL types

This commit is contained in:
Rhys Weatherley
2010-11-15 15:02:21 +10:00
parent 21cbf90d89
commit 443be8eea6
6 changed files with 548 additions and 404 deletions

View File

@@ -281,6 +281,13 @@ public:
FunctionIdentifier *id; FunctionIdentifier *id;
List<Expression *> *arguments; List<Expression *> *arguments;
} function; } function;
int qualifier;
LayoutQualifier *layout;
List<LayoutQualifier *> *layout_list;
struct {
int qualifier;
List<LayoutQualifier *> *layout_list;
} type_qualifier;
// ### ast nodes... // ### ast nodes...
}; };
@@ -1392,231 +1399,241 @@ case $rule_number: {
fully_specified_type ::= type_specifier ; fully_specified_type ::= type_specifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); ast(1) = makeAstNode<QualifiedType>(0, type(1), (List<LayoutQualifier *> *)0);
} break; } break;
./ ./
fully_specified_type ::= type_qualifier type_specifier ; fully_specified_type ::= type_qualifier type_specifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); ast(1) = makeAstNode<QualifiedType>
(sym(1).type_qualifier.qualifier, type(2),
sym(1).type_qualifier.layout_list);
} break; } break;
./ ./
invariant_qualifier ::= INVARIANT ; invariant_qualifier ::= INVARIANT ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Invariant;
} break; } break;
./ ./
interpolation_qualifier ::= SMOOTH ; interpolation_qualifier ::= SMOOTH ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Smooth;
} break; } break;
./ ./
interpolation_qualifier ::= FLAT ; interpolation_qualifier ::= FLAT ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Flat;
} break; } break;
./ ./
interpolation_qualifier ::= NOPERSPECTIVE ; interpolation_qualifier ::= NOPERSPECTIVE ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::NoPerspective;
} break; } break;
./ ./
layout_qualifier ::= LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN ; layout_qualifier ::= LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1) = sym(3);
} break; } break;
./ ./
layout_qualifier_id_list ::= layout_qualifier_id ; layout_qualifier_id_list ::= layout_qualifier_id ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout);
} break; } break;
./ ./
layout_qualifier_id_list ::= layout_qualifier_id_list COMMA layout_qualifier_id ; layout_qualifier_id_list ::= layout_qualifier_id_list COMMA layout_qualifier_id ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout_list, sym(3).layout);
} break; } break;
./ ./
layout_qualifier_id ::= IDENTIFIER ; layout_qualifier_id ::= IDENTIFIER ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).layout = makeAstNode<LayoutQualifier>(string(1), (const std::string *)0);
} break; } break;
./ ./
layout_qualifier_id ::= IDENTIFIER EQUAL NUMBER ; layout_qualifier_id ::= IDENTIFIER EQUAL NUMBER ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).layout = makeAstNode<LayoutQualifier>(string(1), string(3));
} break; } break;
./ ./
parameter_type_qualifier ::= CONST ; parameter_type_qualifier ::= CONST ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Const;
} break; } break;
./ ./
type_qualifier ::= storage_qualifier ; type_qualifier ::= storage_qualifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).type_qualifier.qualifier = sym(1).qualifier;
sym(1).type_qualifier.layout_list = 0;
} break; } break;
./ ./
type_qualifier ::= layout_qualifier ; type_qualifier ::= layout_qualifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).type_qualifier.layout_list = sym(1).layout_list;
sym(1).type_qualifier.qualifier = 0;
} break; } break;
./ ./
type_qualifier ::= layout_qualifier storage_qualifier ; type_qualifier ::= layout_qualifier storage_qualifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).type_qualifier.layout_list = sym(1).layout_list;
sym(1).type_qualifier.qualifier = sym(2).qualifier;
} break; } break;
./ ./
type_qualifier ::= interpolation_qualifier storage_qualifier ; type_qualifier ::= interpolation_qualifier storage_qualifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier;
sym(1).type_qualifier.layout_list = 0;
} break; } break;
./ ./
type_qualifier ::= interpolation_qualifier ; type_qualifier ::= interpolation_qualifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).type_qualifier.qualifier = sym(1).qualifier;
sym(1).type_qualifier.layout_list = 0;
} break; } break;
./ ./
type_qualifier ::= invariant_qualifier storage_qualifier ; type_qualifier ::= invariant_qualifier storage_qualifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier;
sym(1).type_qualifier.layout_list = 0;
} break; } break;
./ ./
type_qualifier ::= invariant_qualifier interpolation_qualifier storage_qualifier ; type_qualifier ::= invariant_qualifier interpolation_qualifier storage_qualifier ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier | sym(3).qualifier;
sym(1).type_qualifier.layout_list = 0;
} break; } break;
./ ./
type_qualifier ::= INVARIANT ; type_qualifier ::= INVARIANT ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).type_qualifier.qualifier = QualifiedType::Invariant;
sym(1).type_qualifier.layout_list = 0;
} break; } break;
./ ./
storage_qualifier ::= CONST ; storage_qualifier ::= CONST ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Const;
} break; } break;
./ ./
storage_qualifier ::= ATTRIBUTE ; storage_qualifier ::= ATTRIBUTE ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Attribute;
} break; } break;
./ ./
storage_qualifier ::= VARYING ; storage_qualifier ::= VARYING ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Varying;
} break; } break;
./ ./
storage_qualifier ::= CENTROID VARYING ; storage_qualifier ::= CENTROID VARYING ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::CentroidVarying;
} break; } break;
./ ./
storage_qualifier ::= IN ; storage_qualifier ::= IN ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::In;
} break; } break;
./ ./
storage_qualifier ::= OUT ; storage_qualifier ::= OUT ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Out;
} break; } break;
./ ./
storage_qualifier ::= CENTROID IN ; storage_qualifier ::= CENTROID IN ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::CentroidIn;
} break; } break;
./ ./
storage_qualifier ::= CENTROID OUT ; storage_qualifier ::= CENTROID OUT ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::CentroidOut;
} break; } break;
./ ./
storage_qualifier ::= PATCH IN ; storage_qualifier ::= PATCH IN ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::PatchIn;
} break; } break;
./ ./
storage_qualifier ::= PATCH OUT ; storage_qualifier ::= PATCH OUT ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::PatchOut;
} break; } break;
./ ./
storage_qualifier ::= SAMPLE IN ; storage_qualifier ::= SAMPLE IN ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::SampleIn;
} break; } break;
./ ./
storage_qualifier ::= SAMPLE OUT ; storage_qualifier ::= SAMPLE OUT ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::SampleOut;
} break; } break;
./ ./
storage_qualifier ::= UNIFORM ; storage_qualifier ::= UNIFORM ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); sym(1).qualifier = QualifiedType::Uniform;
} break; } break;
./ ./
@@ -2326,8 +2343,10 @@ case $rule_number: {
struct_declaration ::= type_qualifier type_specifier struct_declarator_list SEMICOLON ; struct_declaration ::= type_qualifier type_specifier struct_declarator_list SEMICOLON ;
/. /.
case $rule_number: { case $rule_number: {
// TODO: type qualifier sym(1).field_list = StructType::fixInnerTypes
sym(1).field_list = StructType::fixInnerTypes(type(2), sym(3).field_list); (makeAstNode<QualifiedType>
(sym(1).type_qualifier.qualifier, type(2),
sym(1).type_qualifier.layout_list), sym(3).field_list);
} break; } break;
./ ./
@@ -2698,14 +2717,31 @@ case $rule_number: {
external_declaration_list ::= external_declaration ; external_declaration_list ::= external_declaration ;
/. /.
case $rule_number: { case $rule_number: {
sym(1).declaration_list = makeAstNode< List<Declaration *> >(sym(1).declaration); if (sym(1).declaration) {
sym(1).declaration_list = makeAstNode< List<Declaration *> >
(sym(1).declaration);
} else {
sym(1).declaration_list = 0;
}
} break; } break;
./ ./
external_declaration_list ::= external_declaration_list external_declaration ; external_declaration_list ::= external_declaration_list external_declaration ;
/. /.
case $rule_number: { case $rule_number: {
sym(1).declaration_list = makeAstNode< List<Declaration *> >(sym(1).declaration_list, sym(2).declaration); if (sym(1).declaration_list && sym(2).declaration) {
sym(1).declaration_list = makeAstNode< List<Declaration *> >
(sym(1).declaration_list, sym(2).declaration);
} else if (!sym(1).declaration_list) {
if (sym(2).declaration) {
sym(1).declaration_list = makeAstNode< List<Declaration *> >
(sym(2).declaration);
} else {
sym(1).declaration_list = 0;
}
} else {
sym(1).declaration_list = 0;
}
} break; } break;
./ ./
@@ -2726,7 +2762,7 @@ case $rule_number: {
external_declaration ::= SEMICOLON ; external_declaration ::= SEMICOLON ;
/. /.
case $rule_number: { case $rule_number: {
// ast(1) = new ...AST(...); ast(1) = 0;
} break; } break;
./ ./

View File

@@ -335,6 +335,13 @@ List<StructType::Field *> *StructType::fixInnerTypes(Type *innerType, List<Field
return fields; return fields;
} }
void QualifiedType::accept0(Visitor *visitor)
{
if (visitor->visit(this))
accept(type, visitor);
visitor->endVisit(this);
}
void PrecisionDeclaration::accept0(Visitor *visitor) void PrecisionDeclaration::accept0(Visitor *visitor)
{ {
if (visitor->visit(this)) if (visitor->visit(this))

View File

@@ -63,6 +63,7 @@ class BasicType;
class NamedType; class NamedType;
class ArrayType; class ArrayType;
class StructType; class StructType;
class QualifiedType;
class Declaration; class Declaration;
class PrecisionDeclaration; class PrecisionDeclaration;
class Visitor; class Visitor;
@@ -198,6 +199,7 @@ public:
Kind_StructType, Kind_StructType,
Kind_AnonymousStructType, Kind_AnonymousStructType,
Kind_StructField, Kind_StructField,
Kind_QualifiedType,
// Declarations // Declarations
Kind_PrecisionDeclaration Kind_PrecisionDeclaration
@@ -233,6 +235,7 @@ public:
virtual NamedType *asNamedType() { return 0; } virtual NamedType *asNamedType() { return 0; }
virtual ArrayType *asArrayType() { return 0; } virtual ArrayType *asArrayType() { return 0; }
virtual StructType *asStructType() { return 0; } virtual StructType *asStructType() { return 0; }
virtual QualifiedType *asQualifiedType() { return 0; }
virtual Declaration *asDeclaration() { return 0; } virtual Declaration *asDeclaration() { return 0; }
virtual PrecisionDeclaration *asPrecisionDeclaration() { return 0; } virtual PrecisionDeclaration *asPrecisionDeclaration() { return 0; }
@@ -755,6 +758,65 @@ public: // attributes
List<Field *> *fields; List<Field *> *fields;
}; };
class GLSL_EXPORT LayoutQualifier
{
public:
LayoutQualifier(const std::string *_name, const std::string *_number)
: name(_name), number(_number), lineno(0) {}
public: // attributes
const std::string *name;
const std::string *number;
int lineno;
};
class GLSL_EXPORT QualifiedType: public Type
{
public:
QualifiedType(int _qualifiers, Type *_type, List<LayoutQualifier *> *_layout_list)
: Type(Kind_QualifiedType), qualifiers(_qualifiers), type(_type)
, layout_list(_layout_list) {}
enum
{
StorageMask = 0x000000FF,
NoStorage = 0x00000000,
Const = 0x00000001,
Attribute = 0x00000002,
Varying = 0x00000003,
CentroidVarying = 0x00000004,
In = 0x00000005,
Out = 0x00000006,
CentroidIn = 0x00000007,
CentroidOut = 0x00000008,
PatchIn = 0x00000009,
PatchOut = 0x0000000A,
SampleIn = 0x0000000B,
SampleOut = 0x0000000C,
Uniform = 0x0000000D,
InterpolationMask = 0x00000F00,
NoInterpolation = 0x00000000,
Smooth = 0x00000100,
Flat = 0x00000200,
NoPerspective = 0x00000300,
Invariant = 0x00010000
};
virtual QualifiedType *asQualifiedType() { return this; }
virtual void accept0(Visitor *visitor);
virtual Precision precision() const { return type->precision(); }
virtual bool setPrecision(Precision precision) { return type->setPrecision(precision); }
virtual Category category() const { return type->category(); }
public: // attributes
int qualifiers;
Type *type;
List<LayoutQualifier *> *layout_list;
};
class GLSL_EXPORT Declaration: public AST class GLSL_EXPORT Declaration: public AST
{ {
protected: protected:

View File

@@ -117,6 +117,9 @@ public:
virtual bool visit(StructType::Field *) { return true; } virtual bool visit(StructType::Field *) { return true; }
virtual void endVisit(StructType::Field *) {} virtual void endVisit(StructType::Field *) {}
virtual bool visit(QualifiedType *) { return true; }
virtual void endVisit(QualifiedType *) {}
virtual bool visit(PrecisionDeclaration *) { return true; } virtual bool visit(PrecisionDeclaration *) { return true; }
virtual void endVisit(PrecisionDeclaration *) {} virtual void endVisit(PrecisionDeclaration *) {}
}; };

File diff suppressed because it is too large Load Diff

View File

@@ -72,6 +72,13 @@ public:
FunctionIdentifier *id; FunctionIdentifier *id;
List<Expression *> *arguments; List<Expression *> *arguments;
} function; } function;
int qualifier;
LayoutQualifier *layout;
List<LayoutQualifier *> *layout_list;
struct {
int qualifier;
List<LayoutQualifier *> *layout_list;
} type_qualifier;
// ### ast nodes... // ### ast nodes...
}; };