我正在阅读GLSL规范,并在语法部分的第9章中注意到,声明只能由类型限定符组成。这使我相信规范允许这样的声明:
const;
const a;
const a, b;但是,当我用glslangValidator检查它时,这会显示为语法错误:
test.vert
ERROR: 0:1: 'a' : identifier not previously declared
ERROR: 1 compilation errors. No code generated.这些声明应该是有效的吗?它应该是"type_specifier“而不是"type_qualifier”,而这只是一个错误吗?
以下是规范中的相关位元:
invariant_qualifier :
INVARIANT
interpolation_qualifier :
SMOOTH
FLAT
NOPERSPECTIVE
layout_qualifier :
LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN
layout_qualifier_id_list :
layout_qualifier_id
layout_qualifier_id_list COMMA layout_qualifier_id
layout_qualifier_id :
IDENTIFIER
IDENTIFIER EQUAL constant_expression
SHARED
storage_qualifier :
CONST
IN
OUT
INOUT
CENTROID
PATCH
SAMPLE
UNIFORM
BUFFER
SHARED
COHERENT
VOLATILE
RESTRICT
READONLY
WRITEONLY
SUBROUTINE
SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN
precise_qualifier :
PRECISE
type_qualifier :
single_type_qualifier
type_qualifier single_type_qualifier
single_type_qualifier :
storage_qualifier
layout_qualifier
precision_qualifier
interpolation_qualifier
invariant_qualifier
precise_qualifier
declaration :
function_prototype SEMICOLON
init_declarator_list SEMICOLON
PRECISION precision_qualifier type_specifier SEMICOLON
type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE SEMICOLON
type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER SEMICOLON
type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER array_specifier SEMICOLON
type_qualifier SEMICOLON
type_qualifier IDENTIFIER SEMICOLON
type_qualifier IDENTIFIER identifier_list SEMICOLON这里是到完整规范的链接。
发布于 2020-10-26 15:23:10
语言不仅仅是语法结构。你可以写一个符合英语语法规则的句子,但实际上没有任何意义。
这里也是如此。仅使用类型限定符在语法上是合法的。但这并不意味着对每个类型限定符这样做在语义上是有效的。甚至他们中的大多数。
因此,宣言:
const;在语义上没有意义,尽管语法上是合法的。
注意,type-qualifier允许一系列限定符。请注意,这些限定符包括存储限定符in、out、uniform和buffer。
通过允许type-qualifier SEMICOLON,标准允许这样的语法:
layout(std140) uniform;这在语法上和意义上都是有效的。它将此语句之后的所有统一块的默认布局设置为std140。
https://stackoverflow.com/questions/64539761
复制相似问题