OpenGL ES着色器语言规范 9 着色语言语法

 

目录

 9 着色语言语法


9 着色语言语法

语法是从词法分析的输出获得的。词法分析将返回以下标识:

ATTRIBUTE CONST BOOL FLOAT INT
BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN
BVEC2 BVEC3 BVEC4 IVEC2 IVEC3 IVEC4 VEC2 VEC3 VEC4
MAT2 MAT3 MAT4 IN OUT INOUT UNIFORM VARYING
SAMPLER2D SAMPLERCUBE
STRUCT VOID WHILE


IDENTIFIER TYPE_NAME FLOATCONSTANT INTCONSTANT BOOLCONSTANT
FIELD_SELECTION
LEFT_OP RIGHT_OP
INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP
AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN
MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN
SUB_ASSIGN


LEFT_PAREN RIGHT_PAREN LEFT_BRACKET RIGHT_BRACKET LEFT_BRACE RIGHT_BRACE DOT
COMMA COLON EQUAL SEMICOLON BANG DASH TILDE PLUS STAR SLASH PERCENT
LEFT_ANGLE RIGHT_ANGLE VERTICAL_BAR CARET AMPERSAND QUESTION


INVARIANT
HIGH_PRECISION MEDIUM_PRECISION LOW_PRECISION PRECISION

     下面使用上面的标识符描述了OpenGL ES着色语言的语法。

variable_identifier:
    IDENTIFIER


primary_expression:
    variable_identifier
    INTCONSTANT
    FLOATCONSTANT
    BOOLCONSTANT
    LEFT_PAREN expression RIGHT_PAREN


postfix_expression:
    primary_expression
    postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET


function_call
    postfix_expression DOT FIELD_SELECTION
    postfix_expression INC_OP
    postfix_expression DEC_OP

 

integer_expression:
    expression


function_call:
    function_call_generic


function_call_generic:
    function_call_header_with_parameters RIGHT_PAREN
    function_call_header_no_parameters RIGHT_PAREN


function_call_header_no_parameters:
    function_call_header VOID
    function_call_header


function_call_header_with_parameters:
    function_call_header assignment_expression
    function_call_header_with_parameters COMMA assignment_expression


function_call_header:
    function_identifier LEFT_PAREN


function_identifier:
    constructor_identifier
    IDENTIFIER


// 语法注意:构造函数看起来像函数,但词法分析将其中大部分视为关键字
constructor_identifier:
    FLOAT
    INT
    BOOL
    VEC2
    VEC3
    VEC4
    BVEC2
    BVEC3
    BVEC4
    IVEC2
    IVEC3
    IVEC4
    MAT2
    MAT3
    MAT4
    TYPE_NAME


unary_expression:
    postfix_expression
    INC_OP unary_expression
    DEC_OP unary_expression
    unary_operator unary_expression


// 语法注意:没有传统的样式类型。
unary_operator:
    PLUS
    DASH
    BANG
    TILDE // 保留


// 语法注意:没有'*'或'&'一元操作。 指针不受支持。
multiplicative_expression:
    unary_expression
    multiplicative_expression STAR unary_expression
    multiplicative_expression SLASH unary_expression
    multiplicative_expression PERCENT unary_expression // 保留


additive_expression:
    multiplicative_expression
    additive_expression PLUS multiplicative_expression
    additive_expression DASH multiplicative_expression

shift_expression:

    additive_expression
    shift_expression LEFT_OP additive_expression // 保留
    shift_expression RIGHT_OP additive_expression // 保留


relational_expression:
    shift_expression
    relational_expression LEFT_ANGLE shift_expression
    relational_expression RIGHT_ANGLE shift_expression
    relational_expression LE_OP shift_expression
    relational_expression GE_OP shift_expression


equality_expression:
    relational_expression
    equality_expression EQ_OP relational_expression
    equality_expression NE_OP relational_expression


and_expression:
    equality_expression
    and_expression AMPERSAND equality_expression // 保留


exclusive_or_expression:
    and_expression
    exclusive_or_expression CARET and_expression // 保留


inclusive_or_expression:
    exclusive_or_expression
    inclusive_or_expression VERTICAL_BAR exclusive_or_expression // 保留


logical_and_expression:
    inclusive_or_expression
    logical_and_expression AND_OP inclusive_or_expression


logical_xor_expression:
    logical_and_expression
    logical_xor_expression XOR_OP logical_and_expression


logical_or_expression:
    logical_xor_expression
    logical_or_expression OR_OP logical_xor_expression

 

conditional_expression:
    logical_or_expression
    logical_or_expression QUESTION expression COLON assignment_expression


assignment_expression:
    conditional_expression
    unary_expression assignment_operator assignment_expression


assignment_operator:
    EQUAL
    MUL_ASSIGN
    DIV_ASSIGN
    MOD_ASSIGN // 保留
    ADD_ASSIGN
    SUB_ASSIGN
    LEFT_ASSIGN // 保留
    RIGHT_ASSIGN // 保留
    AND_ASSIGN // 保留
    XOR_ASSIGN // 保留
    OR_ASSIGN // 保留


expression:
    assignment_expression
    expression COMMA assignment_expression


constant_expression:
    conditional_expression


declaration:
    function_prototype SEMICOLON
    init_declarator_list SEMICOLON
    PRECISION precision_qualifier type_specifier_no_prec SEMICOLON


function_prototype:
    function_declarator RIGHT_PAREN


function_declarator:
    function_header
    function_header_with_parameters

 

function_header_with_parameters:
    function_header parameter_declaration
    function_header_with_parameters COMMA parameter_declaration


function_header:
    fully_specified_type IDENTIFIER LEFT_PAREN


parameter_declarator:
    type_specifier IDENTIFIER
    type_specifier IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET


parameter_declaration:
    type_qualifier parameter_qualifier parameter_declarator
    parameter_qualifier parameter_declarator
    type_qualifier parameter_qualifier parameter_type_specifier
    parameter_qualifier parameter_type_specifier


parameter_qualifier:
    /* empty */
    IN
    OUT
    INOUT


parameter_type_specifier:
    type_specifier
    type_specifier LEFT_BRACKET constant_expression RIGHT_BRACKET


init_declarator_list:
    single_declaration
    init_declarator_list COMMA IDENTIFIER
    init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET
    init_declarator_list COMMA IDENTIFIER EQUAL initializer


single_declaration:
    fully_specified_type
    fully_specified_type IDENTIFIER
    fully_specified_type IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET

    fully_specified_type IDENTIFIER EQUAL initializer
    INVARIANT IDENTIFIER // 仅在顶点着色器中使用


// 语法注意:没有'enum'或'typedef'。


fully_specified_type:
    type_specifier
    type_qualifier type_specifier


type_qualifier:
    CONST
    ATTRIBUTE // 仅在顶点着色器中使用
    VARYING
    INVARIANT VARYING
    UNIFORM


type_specifier:
    type_specifier_no_prec
    precision_qualifier type_specifier_no_prec


type_specifier_no_prec:
    VOID
    FLOAT
    INT
    BOOL
    VEC2
    VEC3
    VEC4
    BVEC2
    BVEC3
    BVEC4
    IVEC2
    IVEC3
    IVEC4
    MAT2
    MAT3
    MAT4

    SAMPLER2D
    SAMPLERCUBE

    struct_specifier
    TYPE_NAME


precision_qualifier:
    HIGH_PRECISION
    MEDIUM_PRECISION
    LOW_PRECISION


struct_specifier:
    STRUCT IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE
    STRUCT LEFT_BRACE struct_declaration_list RIGHT_BRACE


struct_declaration_list:
    struct_declaration
    struct_declaration_list struct_declaration


struct_declaration:
    type_specifier struct_declarator_list SEMICOLON


struct_declarator_list:
    struct_declarator
    struct_declarator_list COMMA struct_declarator


struct_declarator:
    IDENTIFIER
    IDENTIFIER LEFT_BRACKET
constant_expression RIGHT_BRACKET


initializer:
    assignment_expression


declaration_statement:
    declaration


statement:
    compound_statement
    simple_statement

 

// 语法注意:没有标注的陈述; 'goto'不受支持。


simple_statement:
    declaration_statement
    expression_statement
    selection_statement
    iteration_statement
    jump_statement


compound_statement:
    LEFT_BRACE RIGHT_BRACE
    LEFT_BRACE statement_list RIGHT_BRACE


statement_no_new_scope:
    compound_statement_no_new_scope
    simple_statement


compound_statement_no_new_scope:
    LEFT_BRACE RIGHT_BRACE
    LEFT_BRACE
statement_list RIGHT_BRACE


statement_list:
    statement
    statement_list statement


expression_statement:
    SEMICOLON
    expression SEMICOLON


selection_statement:
    IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement


selection_rest_statement:
    statement ELSE statement
    statement


// 语法注意:没有'switch'。 不支持switch语句。


condition:

    expression
    fully_specified_type IDENTIFIER EQUAL initializer


iteration_statement:
    WHILE LEFT_PAREN condition RIGHT_PAREN statement_no_new_scope
    DO statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON
    FOR LEFT_PAREN for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope


for_init_statement:
    expression_statement
    declaration_statement


conditionopt:
    condition
    /* empty */
    for_rest_statement:
    conditionopt SEMICOLON
    conditionopt SEMICOLON expression


jump_statement:
    CONTINUE SEMICOLON
    BREAK SEMICOLON
    RETURN SEMICOLON

    RETURN expression SEMICOLON
    DISCARD SEMICOLON // 仅在片元着色器中使用


// 语法注意:没有'goto'。 goto不受支持。


translation_unit:
    external_declaration
    translation_unit external_declaration


external_declaration:
    function_definition
    declaration


function_definition:
    function_prototype compound_statement_no_new_scope

 

版权声明:本文为flycatdeng原创文章或译文,转载请加上链接和作者名 https://blog.csdn.net/flycatdeng

Android,OpenGL ES,图形学
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值