1 ---------------------------------------------------------------------------
3 -- This file is part of Qt Creator
5 -- Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 -- Contact: Nokia Corporation (info@qt.nokia.com)
10 -- GNU Lesser General Public License Usage
12 -- This file may be used under the terms of the GNU Lesser General Public
13 -- License version 2.1 as published by the Free Software Foundation and
14 -- appearing in the file LICENSE.LGPL included in the packaging of this file.
15 -- Please review the following information to ensure the GNU Lesser General
16 -- Public License version 2.1 requirements will be met:
17 -- http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
19 -- In addition, as a special exception, Nokia gives you certain additional
20 -- rights. These rights are described in the Nokia Qt LGPL Exception
21 -- version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
25 -- Alternatively, this file may be used in accordance with the terms and
26 -- conditions contained in a signed written agreement between you and Nokia.
28 -- If you have questions regarding the use of this file, please contact
29 -- Nokia at qt-info@nokia.com.
31 ---------------------------------------------------------------------------
35 %parser GLSLParserTable
39 %token FEED_GLSL "feed GLSL"
40 %token FEED_EXPRESSION "feed expression"
42 %token ADD_ASSIGN "+="
44 %token AND_ASSIGN "&="
46 %token ATTRIBUTE "attribute"
55 %token CENTROID "centroid"
59 %token CONTINUE "continue"
62 %token DEFAULT "default"
63 %token DISCARD "discard"
64 %token DIV_ASSIGN "/="
66 %token DMAT2X2 "dmat2x2"
67 %token DMAT2X3 "dmat2x3"
68 %token DMAT2X4 "dmat2x4"
70 %token DMAT3X2 "dmat3x2"
71 %token DMAT3X3 "dmat3x3"
72 %token DMAT3X4 "dmat3x4"
74 %token DMAT4X2 "dmat4x2"
75 %token DMAT4X3 "dmat4x3"
76 %token DMAT4X4 "dmat4x4"
79 %token DOUBLE "double"
91 %token IDENTIFIER "identifier"
97 %token INVARIANT "invariant"
98 %token ISAMPLER1D "isampler1D"
99 %token ISAMPLER1DARRAY "isampler1DArray"
100 %token ISAMPLER2D "isampler2D"
101 %token ISAMPLER2DARRAY "isampler2DArray"
102 %token ISAMPLER2DMS "isampler2DMS"
103 %token ISAMPLER2DMSARRAY "isampler2DMSArray"
104 %token ISAMPLER2DRECT "isampler2DRect"
105 %token ISAMPLER3D "isampler3D"
106 %token ISAMPLERBUFFER "isamplerBuffer"
107 %token ISAMPLERCUBE "isamplerCube"
108 %token ISAMPLERCUBEARRAY "isamplerCubeArray"
112 %token LAYOUT "layout"
113 %token LEFT_ANGLE "<"
114 %token LEFT_ASSIGN "<<="
115 %token LEFT_BRACE "{"
116 %token LEFT_BRACKET "["
118 %token LEFT_PAREN "("
122 %token MAT2X2 "mat2x2"
123 %token MAT2X3 "mat2x3"
124 %token MAT2X4 "mat2x4"
126 %token MAT3X2 "mat3x2"
127 %token MAT3X3 "mat3x3"
128 %token MAT3X4 "mat3x4"
130 %token MAT4X2 "mat4x2"
131 %token MAT4X3 "mat4x3"
132 %token MAT4X4 "mat4x4"
133 %token MEDIUMP "mediump"
134 %token MOD_ASSIGN "%="
135 %token MUL_ASSIGN "*="
137 %token NOPERSPECTIVE "noperspective"
138 %token NUMBER "number constant"
139 %token OR_ASSIGN "|="
145 %token PRECISION "precision"
147 %token RETURN "return"
148 %token RIGHT_ANGLE ">"
149 %token RIGHT_ASSIGN ">>="
150 %token RIGHT_BRACE "}"
151 %token RIGHT_BRACKET "]"
153 %token RIGHT_PAREN ")"
154 %token SAMPLE "sample"
155 %token SAMPLER1D "sampler1D"
156 %token SAMPLER1DARRAY "sampler1DArray"
157 %token SAMPLER1DARRAYSHADOW "sampler1DArrayShadow"
158 %token SAMPLER1DSHADOW "sampler1DShadow"
159 %token SAMPLER2D "sampler2D"
160 %token SAMPLER2DARRAY "sampler2DArray"
161 %token SAMPLER2DARRAYSHADOW "sampler2DArrayShadow"
162 %token SAMPLER2DMS "sampler2DMS"
163 %token SAMPLER2DMSARRAY "sampler2DMSArray"
164 %token SAMPLER2DRECT "sampler2DRect"
165 %token SAMPLER2DRECTSHADOW "sampler2DRectShadow"
166 %token SAMPLER2DSHADOW "sampler2DShadow"
167 %token SAMPLER3D "sampler3D"
168 %token SAMPLERBUFFER "samplerBuffer"
169 %token SAMPLERCUBE "samplerCube"
170 %token SAMPLERCUBEARRAY "samplerCubeArray"
171 %token SAMPLERCUBEARRAYSHADOW "samplerCubeArrayShadow"
172 %token SAMPLERCUBESHADOW "samplerCubeShadow"
175 %token SMOOTH "smooth"
177 %token STRUCT "struct"
178 %token SUBROUTINE "subroutine"
179 %token SUB_ASSIGN "-="
180 %token SWITCH "switch"
182 %token TYPE_NAME "type_name"
184 %token UNIFORM "uniform"
185 %token USAMPLER1D "usampler1D"
186 %token USAMPLER1DARRAY "usampler1DArray"
187 %token USAMPLER2D "usampler2D"
188 %token USAMPLER2DARRAY "usampler2DArray"
189 %token USAMPLER2DMS "usampler2DMS"
190 %token USAMPLER2DMSARRAY "usampler2DMSarray"
191 %token USAMPLER2DRECT "usampler2DRect"
192 %token USAMPLER3D "usampler3D"
193 %token USAMPLERBUFFER "usamplerBuffer"
194 %token USAMPLERCUBE "usamplerCube"
195 %token USAMPLERCUBEARRAY "usamplerCubeArray"
199 %token VARYING "varying"
203 %token VERTICAL_BAR "|"
206 %token XOR_ASSIGN "^="
210 %token PREPROC "preprocessor directive"
211 %token COMMENT "comment"
213 %token RESERVED "reserved word"
218 /**************************************************************************
220 ** This file is part of Qt Creator
222 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
224 ** Contact: Nokia Corporation (info@qt.nokia.com)
227 ** GNU Lesser General Public License Usage
229 ** This file may be used under the terms of the GNU Lesser General Public
230 ** License version 2.1 as published by the Free Software Foundation and
231 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
232 ** Please review the following information to ensure the GNU Lesser General
233 ** Public License version 2.1 requirements will be met:
234 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
236 ** In addition, as a special exception, Nokia gives you certain additional
237 ** rights. These rights are described in the Nokia Qt LGPL Exception
238 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
242 ** Alternatively, this file may be used in accordance with the terms and
243 ** conditions contained in a signed written agreement between you and Nokia.
245 ** If you have questions regarding the use of this file, please contact
246 ** Nokia at qt-info@nokia.com.
248 **************************************************************************/
251 #include "glsllexer.h"
253 #include "glslengine.h"
259 class GLSL_EXPORT Parser: public $table
264 const QString *string;
266 List<AST *> *ast_list;
267 DeclarationAST *declaration;
268 List<DeclarationAST *> *declaration_list;
269 ExpressionAST *expression;
270 List<ExpressionAST *> *expression_list;
271 StatementAST *statement;
272 List<StatementAST *> *statement_list;
274 StructTypeAST::Field *field;
275 List<StructTypeAST::Field *> *field_list;
276 TranslationUnitAST *translation_unit;
277 FunctionIdentifierAST *function_identifier;
279 TypeAST::Precision precision;
281 StatementAST *thenClause;
282 StatementAST *elseClause;
285 ExpressionAST *condition;
286 ExpressionAST *increment;
289 FunctionIdentifierAST *id;
290 List<ExpressionAST *> *arguments;
293 LayoutQualifier *layout;
294 List<LayoutQualifier *> *layout_list;
297 List<LayoutQualifier *> *layout_list;
303 ParameterDeclarationAST *param_declaration;
304 FunctionDeclarationAST *function_declaration;
307 Parser(Engine *engine, const char *source, unsigned size, int variant);
310 TranslationUnitAST *parse() {
311 if (AST *u = parse(T_FEED_GLSL))
312 return u->asTranslationUnit();
316 ExpressionAST *parseExpression() {
317 if (AST *u = parse(T_FEED_EXPRESSION))
318 return u->asExpression();
322 AST *parse(int startToken);
326 int &location(int n) { return _locationStack[_tos + n - 1]; }
327 Value &sym(int n) { return _symStack[_tos + n - 1]; }
328 AST *&ast(int n) { return _symStack[_tos + n - 1].ast; }
329 const QString *&string(int n) { return _symStack[_tos + n - 1].string; }
330 ExpressionAST *&expression(int n) { return _symStack[_tos + n - 1].expression; }
331 StatementAST *&statement(int n) { return _symStack[_tos + n - 1].statement; }
332 TypeAST *&type(int n) { return _symStack[_tos + n - 1].type; }
333 FunctionDeclarationAST *&function(int n) { return _symStack[_tos + n - 1].function_declaration; }
335 inline int consumeToken() {
336 if (_index < int(_tokens.size()))
338 return _tokens.size() - 1;
340 inline const Token &tokenAt(int index) const {
343 return _tokens.at(index);
345 inline int tokenKind(int index) const {
347 return _startToken.kind;
348 return _tokens.at(index).kind;
350 void reduce(int ruleno);
352 void warning(int line, const QString &message)
354 _engine->warning(line, message);
357 void error(int line, const QString &message)
359 _engine->error(line, message);
362 template <typename T>
365 T *node = new (_engine->pool()) T ();
366 node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
370 template <typename T, typename A1>
371 T *makeAstNode(A1 a1)
373 T *node = new (_engine->pool()) T (a1);
374 node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
378 template <typename T, typename A1, typename A2>
379 T *makeAstNode(A1 a1, A2 a2)
381 T *node = new (_engine->pool()) T (a1, a2);
382 node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
386 template <typename T, typename A1, typename A2, typename A3>
387 T *makeAstNode(A1 a1, A2 a2, A3 a3)
389 T *node = new (_engine->pool()) T (a1, a2, a3);
390 node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
394 template <typename T, typename A1, typename A2, typename A3, typename A4>
395 T *makeAstNode(A1 a1, A2 a2, A3 a3, A4 a4)
397 T *node = new (_engine->pool()) T (a1, a2, a3, a4);
398 node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
402 TypeAST *makeBasicType(int token)
404 TypeAST *type = new (_engine->pool()) BasicTypeAST(token, spell[token]);
405 type->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
418 std::vector<int> _stateStack;
419 std::vector<int> _locationStack;
420 std::vector<Value> _symStack;
421 std::vector<Token> _tokens;
428 /**************************************************************************
430 ** This file is part of Qt Creator
432 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
434 ** Contact: Nokia Corporation (info@qt.nokia.com)
437 ** GNU Lesser General Public License Usage
439 ** This file may be used under the terms of the GNU Lesser General Public
440 ** License version 2.1 as published by the Free Software Foundation and
441 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
442 ** Please review the following information to ensure the GNU Lesser General
443 ** Public License version 2.1 requirements will be met:
444 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
446 ** In addition, as a special exception, Nokia gives you certain additional
447 ** rights. These rights are described in the Nokia Qt LGPL Exception
448 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
452 ** Alternatively, this file may be used in accordance with the terms and
453 ** conditions contained in a signed written agreement between you and Nokia.
455 ** If you have questions regarding the use of this file, please contact
456 ** Nokia at qt-info@nokia.com.
458 **************************************************************************/
460 #include "glslparser.h"
461 #include "glslengine.h"
465 #include <QtCore/QDebug>
467 using namespace GLSL;
469 Parser::Parser(Engine *engine, const char *source, unsigned size, int variant)
470 : _engine(engine), _tos(-1), _index(0), yyloc(-1), yytoken(-1), yyrecovering(0), _recovered(false)
472 _tokens.reserve(1024);
474 _stateStack.resize(128);
475 _locationStack.resize(128);
476 _symStack.resize(128);
478 _tokens.push_back(Token()); // invalid token
480 std::stack<int> parenStack;
481 std::stack<int> bracketStack;
482 std::stack<int> braceStack;
484 Lexer lexer(engine, source, size);
485 lexer.setVariant(variant);
492 parenStack.push(_tokens.size());
495 bracketStack.push(_tokens.size());
498 braceStack.push(_tokens.size());
502 if (! parenStack.empty()) {
503 _tokens[parenStack.top()].matchingBrace = _tokens.size();
507 case T_RIGHT_BRACKET:
508 if (! bracketStack.empty()) {
509 _tokens[bracketStack.top()].matchingBrace = _tokens.size();
514 if (! braceStack.empty()) {
515 _tokens[braceStack.top()].matchingBrace = _tokens.size();
523 _tokens.push_back(tk);
524 } while (tk.isNot(EOF_SYMBOL));
533 AST *Parser::parse(int startToken)
538 void *yyval = 0; // value of the current token.
542 _startToken.kind = startToken;
546 if (unsigned(++_tos) == _stateStack.size()) {
547 _stateStack.resize(_tos * 2);
548 _locationStack.resize(_tos * 2);
549 _symStack.resize(_tos * 2);
552 _stateStack[_tos] = action;
554 if (yytoken == -1 && -TERMINAL_COUNT != action_index[action]) {
555 yyloc = consumeToken();
556 yytoken = tokenKind(yyloc);
559 if (yytoken == T_IDENTIFIER && t_action(action, T_TYPE_NAME) != 0) {
560 const Token &la = tokenAt(_index);
562 if (la.is(T_IDENTIFIER)) {
563 yytoken = T_TYPE_NAME;
564 } else if (la.is(T_LEFT_BRACKET) && la.matchingBrace != 0 &&
565 tokenAt(la.matchingBrace + 1).is(T_IDENTIFIER)) {
566 yytoken = T_TYPE_NAME;
569 yyval = _tokens.at(yyloc).ptr;
572 action = t_action(action, yytoken);
574 if (action == ACCEPT_STATE) {
576 return _symStack[0].translation_unit;
578 _symStack[_tos].ptr = yyval;
579 _locationStack[_tos] = yyloc;
581 } else if (action < 0) {
582 const int ruleno = -action - 1;
583 const int N = rhs[ruleno];
586 action = nt_action(_stateStack[_tos], lhs[ruleno] - TERMINAL_COUNT);
587 } else if (action == 0) {
588 const int line = _tokens[yyloc].line + 1;
589 QString message = QLatin1String("Syntax error");
591 const QLatin1String s(spell[yytoken]);
592 message = QString("Unexpected token `%1'").arg(s);
595 for (; _tos; --_tos) {
596 const int state = _stateStack[_tos];
599 T_RIGHT_BRACE, T_RIGHT_PAREN, T_RIGHT_BRACKET,
600 T_SEMICOLON, T_COMMA, T_COLON,
601 T_NUMBER, T_TYPE_NAME, T_IDENTIFIER,
602 T_LEFT_BRACE, T_LEFT_PAREN, T_LEFT_BRACKET,
607 for (int *tptr = tks; *tptr; ++tptr) {
608 const int next = t_action(state, *tptr);
610 if (! yyrecovering && ! _recovered) {
612 error(line, QString("Expected `%1'").arg(QLatin1String(spell[*tptr])));
616 if (*tptr == T_IDENTIFIER)
617 yyval = (void *) _engine->identifier(QLatin1String("$identifier"));
618 else if (*tptr == T_NUMBER || *tptr == T_TYPE_NAME)
619 yyval = (void *) _engine->identifier(QLatin1String("$0"));
623 _symStack[_tos].ptr = yyval;
624 _locationStack[_tos] = yyloc;
635 error(line, message);
648 void Parser::reduce(int ruleno)
655 variable_identifier ::= IDENTIFIER ;
658 ast(1) = makeAstNode<IdentifierExpressionAST>(string(1));
662 primary_expression ::= NUMBER ;
665 ast(1) = makeAstNode<LiteralExpressionAST>(string(1));
669 primary_expression ::= TRUE ;
672 ast(1) = makeAstNode<LiteralExpressionAST>(_engine->identifier("true", 4));
676 primary_expression ::= FALSE ;
679 ast(1) = makeAstNode<LiteralExpressionAST>(_engine->identifier("false", 5));
683 primary_expression ::= variable_identifier ;
690 primary_expression ::= LEFT_PAREN expression RIGHT_PAREN ;
697 postfix_expression ::= primary_expression ;
704 postfix_expression ::= postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET ;
707 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ArrayAccess, expression(1), expression(3));
711 postfix_expression ::= function_call ;
718 postfix_expression ::= postfix_expression DOT IDENTIFIER ;
721 ast(1) = makeAstNode<MemberAccessExpressionAST>(expression(1), string(3));
725 postfix_expression ::= postfix_expression INC_OP ;
728 ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PostIncrement, expression(1));
732 postfix_expression ::= postfix_expression DEC_OP ;
735 ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PostDecrement, expression(1));
739 integer_expression ::= expression ;
746 function_call ::= function_call_or_method ;
753 function_call_or_method ::= function_call_generic ;
756 ast(1) = makeAstNode<FunctionCallExpressionAST>
757 (sym(1).function.id, sym(1).function.arguments);
761 function_call_or_method ::= postfix_expression DOT function_call_generic ;
764 ast(1) = makeAstNode<FunctionCallExpressionAST>
765 (expression(1), sym(3).function.id, sym(3).function.arguments);
769 function_call_generic ::= function_call_header_with_parameters RIGHT_PAREN ;
776 function_call_generic ::= function_call_header_no_parameters RIGHT_PAREN ;
783 function_call_header_no_parameters ::= function_call_header VOID ;
786 sym(1).function.id = sym(1).function_identifier;
787 sym(1).function.arguments = 0;
791 function_call_header_no_parameters ::= function_call_header ;
794 sym(1).function.id = sym(1).function_identifier;
795 sym(1).function.arguments = 0;
799 function_call_header_with_parameters ::= function_call_header assignment_expression ;
802 sym(1).function.id = sym(1).function_identifier;
803 sym(1).function.arguments =
804 makeAstNode< List<ExpressionAST *> >(expression(2));
808 function_call_header_with_parameters ::= function_call_header_with_parameters COMMA assignment_expression ;
811 sym(1).function.arguments =
812 makeAstNode< List<ExpressionAST *> >
813 (sym(1).function.arguments, expression(3));
817 function_call_header ::= function_identifier LEFT_PAREN ;
824 function_identifier ::= type_specifier ;
827 ast(1) = makeAstNode<FunctionIdentifierAST>(type(1));
831 function_identifier ::= IDENTIFIER ;
834 ast(1) = makeAstNode<FunctionIdentifierAST>(string(1));
838 unary_expression ::= postfix_expression ;
845 unary_expression ::= INC_OP unary_expression ;
848 ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PreIncrement, expression(2));
852 unary_expression ::= DEC_OP unary_expression ;
855 ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PreDecrement, expression(2));
859 unary_expression ::= unary_operator unary_expression ;
862 ast(1) = makeAstNode<UnaryExpressionAST>(sym(1).kind, expression(2));
866 unary_operator ::= PLUS ;
869 sym(1).kind = AST::Kind_UnaryPlus;
873 unary_operator ::= DASH ;
876 sym(1).kind = AST::Kind_UnaryMinus;
880 unary_operator ::= BANG ;
883 sym(1).kind = AST::Kind_LogicalNot;
887 unary_operator ::= TILDE ;
890 sym(1).kind = AST::Kind_BitwiseNot;
894 multiplicative_expression ::= unary_expression ;
901 multiplicative_expression ::= multiplicative_expression STAR unary_expression ;
904 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Multiply, expression(1), expression(3));
908 multiplicative_expression ::= multiplicative_expression SLASH unary_expression ;
911 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Divide, expression(1), expression(3));
915 multiplicative_expression ::= multiplicative_expression PERCENT unary_expression ;
918 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Modulus, expression(1), expression(3));
922 additive_expression ::= multiplicative_expression ;
929 additive_expression ::= additive_expression PLUS multiplicative_expression ;
932 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Plus, expression(1), expression(3));
936 additive_expression ::= additive_expression DASH multiplicative_expression ;
939 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Minus, expression(1), expression(3));
943 shift_expression ::= additive_expression ;
950 shift_expression ::= shift_expression LEFT_OP additive_expression ;
953 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ShiftLeft, expression(1), expression(3));
957 shift_expression ::= shift_expression RIGHT_OP additive_expression ;
960 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ShiftRight, expression(1), expression(3));
964 relational_expression ::= shift_expression ;
971 relational_expression ::= relational_expression LEFT_ANGLE shift_expression ;
974 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LessThan, expression(1), expression(3));
978 relational_expression ::= relational_expression RIGHT_ANGLE shift_expression ;
981 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_GreaterThan, expression(1), expression(3));
985 relational_expression ::= relational_expression LE_OP shift_expression ;
988 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LessEqual, expression(1), expression(3));
992 relational_expression ::= relational_expression GE_OP shift_expression ;
995 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_GreaterEqual, expression(1), expression(3));
999 equality_expression ::= relational_expression ;
1001 case $rule_number: {
1006 equality_expression ::= equality_expression EQ_OP relational_expression ;
1008 case $rule_number: {
1009 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Equal, expression(1), expression(3));
1013 equality_expression ::= equality_expression NE_OP relational_expression ;
1015 case $rule_number: {
1016 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_NotEqual, expression(1), expression(3));
1020 and_expression ::= equality_expression ;
1022 case $rule_number: {
1027 and_expression ::= and_expression AMPERSAND equality_expression ;
1029 case $rule_number: {
1030 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseAnd, expression(1), expression(3));
1034 exclusive_or_expression ::= and_expression ;
1036 case $rule_number: {
1041 exclusive_or_expression ::= exclusive_or_expression CARET and_expression ;
1043 case $rule_number: {
1044 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseXor, expression(1), expression(3));
1048 inclusive_or_expression ::= exclusive_or_expression ;
1050 case $rule_number: {
1055 inclusive_or_expression ::= inclusive_or_expression VERTICAL_BAR exclusive_or_expression ;
1057 case $rule_number: {
1058 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseOr, expression(1), expression(3));
1062 logical_and_expression ::= inclusive_or_expression ;
1064 case $rule_number: {
1069 logical_and_expression ::= logical_and_expression AND_OP inclusive_or_expression ;
1071 case $rule_number: {
1072 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalAnd, expression(1), expression(3));
1076 logical_xor_expression ::= logical_and_expression ;
1078 case $rule_number: {
1083 logical_xor_expression ::= logical_xor_expression XOR_OP logical_and_expression ;
1085 case $rule_number: {
1086 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalXor, expression(1), expression(3));
1090 logical_or_expression ::= logical_xor_expression ;
1092 case $rule_number: {
1097 logical_or_expression ::= logical_or_expression OR_OP logical_xor_expression ;
1099 case $rule_number: {
1100 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalOr, expression(1), expression(3));
1104 conditional_expression ::= logical_or_expression ;
1106 case $rule_number: {
1111 conditional_expression ::= logical_or_expression QUESTION expression COLON assignment_expression ;
1113 case $rule_number: {
1114 ast(1) = makeAstNode<TernaryExpressionAST>(AST::Kind_Conditional, expression(1), expression(3), expression(5));
1118 assignment_expression ::= conditional_expression ;
1120 case $rule_number: {
1125 assignment_expression ::= unary_expression assignment_operator assignment_expression ;
1127 case $rule_number: {
1128 ast(1) = makeAstNode<AssignmentExpressionAST>(sym(2).kind, expression(1), expression(3));
1132 assignment_operator ::= EQUAL ;
1134 case $rule_number: {
1135 sym(1).kind = AST::Kind_Assign;
1139 assignment_operator ::= MUL_ASSIGN ;
1141 case $rule_number: {
1142 sym(1).kind = AST::Kind_AssignMultiply;
1146 assignment_operator ::= DIV_ASSIGN ;
1148 case $rule_number: {
1149 sym(1).kind = AST::Kind_AssignDivide;
1153 assignment_operator ::= MOD_ASSIGN ;
1155 case $rule_number: {
1156 sym(1).kind = AST::Kind_AssignModulus;
1160 assignment_operator ::= ADD_ASSIGN ;
1162 case $rule_number: {
1163 sym(1).kind = AST::Kind_AssignPlus;
1167 assignment_operator ::= SUB_ASSIGN ;
1169 case $rule_number: {
1170 sym(1).kind = AST::Kind_AssignMinus;
1174 assignment_operator ::= LEFT_ASSIGN ;
1176 case $rule_number: {
1177 sym(1).kind = AST::Kind_AssignShiftLeft;
1181 assignment_operator ::= RIGHT_ASSIGN ;
1183 case $rule_number: {
1184 sym(1).kind = AST::Kind_AssignShiftRight;
1188 assignment_operator ::= AND_ASSIGN ;
1190 case $rule_number: {
1191 sym(1).kind = AST::Kind_AssignAnd;
1195 assignment_operator ::= XOR_ASSIGN ;
1197 case $rule_number: {
1198 sym(1).kind = AST::Kind_AssignXor;
1202 assignment_operator ::= OR_ASSIGN ;
1204 case $rule_number: {
1205 sym(1).kind = AST::Kind_AssignOr;
1209 expression ::= assignment_expression ;
1211 case $rule_number: {
1216 expression ::= expression COMMA assignment_expression ;
1218 case $rule_number: {
1219 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Comma, expression(1), expression(3));
1223 constant_expression ::= conditional_expression ;
1225 case $rule_number: {
1230 declaration ::= function_prototype SEMICOLON ;
1232 case $rule_number: {
1237 declaration ::= init_declarator_list SEMICOLON ;
1239 case $rule_number: {
1240 ast(1) = makeAstNode<InitDeclarationAST>(sym(1).declaration_list);
1244 declaration ::= PRECISION precision_qualifier type_specifier_no_prec SEMICOLON ;
1246 case $rule_number: {
1247 ast(1) = makeAstNode<PrecisionDeclarationAST>(sym(2).precision, type(3));
1251 declaration ::= type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE SEMICOLON ;
1253 case $rule_number: {
1254 if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) {
1255 // TODO: issue an error if the qualifier is not "struct".
1257 TypeAST *type = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
1258 ast(1) = makeAstNode<TypeDeclarationAST>(type);
1262 declaration ::= type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER SEMICOLON ;
1264 case $rule_number: {
1265 if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) {
1266 // TODO: issue an error if the qualifier does not contain "struct".
1268 TypeAST *type = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
1269 TypeAST *qualtype = type;
1270 if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) {
1271 qualtype = makeAstNode<QualifiedTypeAST>
1272 (sym(1).type_qualifier.qualifier & ~QualifiedTypeAST::Struct, qualtype,
1273 sym(1).type_qualifier.layout_list);
1275 ast(1) = makeAstNode<TypeAndVariableDeclarationAST>
1276 (makeAstNode<TypeDeclarationAST>(type),
1277 makeAstNode<VariableDeclarationAST>(qualtype, string(6)));
1281 declaration ::= type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER LEFT_BRACKET RIGHT_BRACKET SEMICOLON ;
1283 case $rule_number: {
1284 if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) {
1285 // TODO: issue an error if the qualifier does not contain "struct".
1287 TypeAST *type = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
1288 TypeAST *qualtype = type;
1289 if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) {
1290 qualtype = makeAstNode<QualifiedTypeAST>
1291 (sym(1).type_qualifier.qualifier & ~QualifiedTypeAST::Struct, qualtype,
1292 sym(1).type_qualifier.layout_list);
1294 ast(1) = makeAstNode<TypeAndVariableDeclarationAST>
1295 (makeAstNode<TypeDeclarationAST>(type),
1296 makeAstNode<VariableDeclarationAST>
1297 (makeAstNode<ArrayTypeAST>(qualtype), string(6)));
1301 declaration ::= type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET SEMICOLON ;
1303 case $rule_number: {
1304 if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) {
1305 // TODO: issue an error if the qualifier does not contain "struct".
1307 TypeAST *type = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
1308 TypeAST *qualtype = type;
1309 if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) {
1310 qualtype = makeAstNode<QualifiedTypeAST>
1311 (sym(1).type_qualifier.qualifier & ~QualifiedTypeAST::Struct, qualtype,
1312 sym(1).type_qualifier.layout_list);
1314 ast(1) = makeAstNode<TypeAndVariableDeclarationAST>
1315 (makeAstNode<TypeDeclarationAST>(type),
1316 makeAstNode<VariableDeclarationAST>
1317 (makeAstNode<ArrayTypeAST>(qualtype, expression(8)), string(6)));
1321 declaration ::= type_qualifier SEMICOLON ;
1323 case $rule_number: {
1324 TypeAST *type = makeAstNode<QualifiedTypeAST>
1325 (sym(1).type_qualifier.qualifier, (TypeAST *)0,
1326 sym(1).type_qualifier.layout_list);
1327 ast(1) = makeAstNode<TypeDeclarationAST>(type);
1331 function_prototype ::= function_declarator RIGHT_PAREN ;
1333 case $rule_number: {
1334 function(1)->finishParams();
1338 function_declarator ::= function_header ;
1340 case $rule_number: {
1345 function_declarator ::= function_header_with_parameters ;
1347 case $rule_number: {
1352 function_header_with_parameters ::= function_header parameter_declaration ;
1354 case $rule_number: {
1355 function(1)->params = makeAstNode< List<ParameterDeclarationAST *> >
1356 (sym(2).param_declaration);
1360 function_header_with_parameters ::= function_header_with_parameters COMMA parameter_declaration ;
1362 case $rule_number: {
1363 function(1)->params = makeAstNode< List<ParameterDeclarationAST *> >
1364 (function(1)->params, sym(3).param_declaration);
1368 function_header ::= fully_specified_type IDENTIFIER LEFT_PAREN ;
1370 case $rule_number: {
1371 function(1) = makeAstNode<FunctionDeclarationAST>(type(1), string(2));
1375 parameter_declarator ::= type_specifier IDENTIFIER ;
1377 case $rule_number: {
1378 sym(1).param_declarator.type = type(1);
1379 sym(1).param_declarator.name = string(2);
1383 parameter_declarator ::= type_specifier IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET ;
1385 case $rule_number: {
1386 sym(1).param_declarator.type = makeAstNode<ArrayTypeAST>(type(1), expression(4));
1387 sym(1).param_declarator.name = string(2);
1391 parameter_declaration ::= parameter_type_qualifier parameter_qualifier parameter_declarator ;
1393 case $rule_number: {
1394 ast(1) = makeAstNode<ParameterDeclarationAST>
1395 (makeAstNode<QualifiedTypeAST>
1396 (sym(1).qualifier, sym(3).param_declarator.type,
1397 (List<LayoutQualifier *> *)0),
1398 ParameterDeclarationAST::Qualifier(sym(2).qualifier),
1399 sym(3).param_declarator.name);
1403 parameter_declaration ::= parameter_qualifier parameter_declarator ;
1405 case $rule_number: {
1406 ast(1) = makeAstNode<ParameterDeclarationAST>
1407 (sym(2).param_declarator.type,
1408 ParameterDeclarationAST::Qualifier(sym(1).qualifier),
1409 sym(2).param_declarator.name);
1413 parameter_declaration ::= parameter_type_qualifier parameter_qualifier parameter_type_specifier ;
1415 case $rule_number: {
1416 ast(1) = makeAstNode<ParameterDeclarationAST>
1417 (makeAstNode<QualifiedTypeAST>
1418 (sym(1).qualifier, type(3), (List<LayoutQualifier *> *)0),
1419 ParameterDeclarationAST::Qualifier(sym(2).qualifier),
1420 (const QString *)0);
1424 parameter_declaration ::= parameter_qualifier parameter_type_specifier ;
1426 case $rule_number: {
1427 ast(1) = makeAstNode<ParameterDeclarationAST>
1428 (type(2), ParameterDeclarationAST::Qualifier(sym(1).qualifier),
1429 (const QString *)0);
1433 parameter_qualifier ::= empty ;
1435 case $rule_number: {
1436 sym(1).qualifier = ParameterDeclarationAST::In;
1440 parameter_qualifier ::= IN ;
1442 case $rule_number: {
1443 sym(1).qualifier = ParameterDeclarationAST::In;
1447 parameter_qualifier ::= OUT ;
1449 case $rule_number: {
1450 sym(1).qualifier = ParameterDeclarationAST::Out;
1454 parameter_qualifier ::= INOUT ;
1456 case $rule_number: {
1457 sym(1).qualifier = ParameterDeclarationAST::InOut;
1461 parameter_type_specifier ::= type_specifier ;
1463 case $rule_number: {
1468 init_declarator_list ::= single_declaration ;
1470 case $rule_number: {
1471 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
1472 (sym(1).declaration);
1476 init_declarator_list ::= init_declarator_list COMMA IDENTIFIER ;
1478 case $rule_number: {
1479 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
1480 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>(type, string(3));
1481 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
1482 (sym(1).declaration_list, decl);
1486 init_declarator_list ::= init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET ;
1488 case $rule_number: {
1489 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
1490 type = makeAstNode<ArrayTypeAST>(type);
1491 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>(type, string(3));
1492 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
1493 (sym(1).declaration_list, decl);
1497 init_declarator_list ::= init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET ;
1499 case $rule_number: {
1500 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
1501 type = makeAstNode<ArrayTypeAST>(type, expression(5));
1502 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>(type, string(3));
1503 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
1504 (sym(1).declaration_list, decl);
1508 init_declarator_list ::= init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET EQUAL initializer ;
1510 case $rule_number: {
1511 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
1512 type = makeAstNode<ArrayTypeAST>(type);
1513 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>
1514 (type, string(3), expression(7));
1515 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
1516 (sym(1).declaration_list, decl);
1520 init_declarator_list ::= init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET EQUAL initializer ;
1522 case $rule_number: {
1523 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
1524 type = makeAstNode<ArrayTypeAST>(type, expression(5));
1525 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>
1526 (type, string(3), expression(8));
1527 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
1528 (sym(1).declaration_list, decl);
1532 init_declarator_list ::= init_declarator_list COMMA IDENTIFIER EQUAL initializer ;
1534 case $rule_number: {
1535 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
1536 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>
1537 (type, string(3), expression(5));
1538 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
1539 (sym(1).declaration_list, decl);
1543 single_declaration ::= fully_specified_type ;
1545 case $rule_number: {
1546 ast(1) = makeAstNode<TypeDeclarationAST>(type(1));
1550 single_declaration ::= fully_specified_type IDENTIFIER ;
1552 case $rule_number: {
1553 ast(1) = makeAstNode<VariableDeclarationAST>(type(1), string(2));
1557 single_declaration ::= fully_specified_type IDENTIFIER LEFT_BRACKET RIGHT_BRACKET ;
1559 case $rule_number: {
1560 ast(1) = makeAstNode<VariableDeclarationAST>
1561 (makeAstNode<ArrayTypeAST>(type(1)), string(2));
1565 single_declaration ::= fully_specified_type IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET ;
1567 case $rule_number: {
1568 ast(1) = makeAstNode<VariableDeclarationAST>
1569 (makeAstNode<ArrayTypeAST>(type(1), expression(4)), string(2));
1573 single_declaration ::= fully_specified_type IDENTIFIER LEFT_BRACKET RIGHT_BRACKET EQUAL initializer ;
1575 case $rule_number: {
1576 ast(1) = makeAstNode<VariableDeclarationAST>
1577 (makeAstNode<ArrayTypeAST>(type(1)), string(2), expression(6));
1581 single_declaration ::= fully_specified_type IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET EQUAL initializer ;
1583 case $rule_number: {
1584 ast(1) = makeAstNode<VariableDeclarationAST>
1585 (makeAstNode<ArrayTypeAST>(type(1), expression(4)),
1586 string(2), expression(7));
1590 single_declaration ::= fully_specified_type IDENTIFIER EQUAL initializer ;
1592 case $rule_number: {
1593 ast(1) = makeAstNode<VariableDeclarationAST>
1594 (type(1), string(2), expression(4));
1598 single_declaration ::= INVARIANT IDENTIFIER ;
1600 case $rule_number: {
1601 ast(1) = makeAstNode<InvariantDeclarationAST>(string(2));
1605 fully_specified_type ::= type_specifier ;
1607 case $rule_number: {
1608 ast(1) = makeAstNode<QualifiedTypeAST>(0, type(1), (List<LayoutQualifier *> *)0);
1612 fully_specified_type ::= type_qualifier type_specifier ;
1614 case $rule_number: {
1615 ast(1) = makeAstNode<QualifiedTypeAST>
1616 (sym(1).type_qualifier.qualifier, type(2),
1617 sym(1).type_qualifier.layout_list);
1621 invariant_qualifier ::= INVARIANT ;
1623 case $rule_number: {
1624 sym(1).qualifier = QualifiedTypeAST::Invariant;
1628 interpolation_qualifier ::= SMOOTH ;
1630 case $rule_number: {
1631 sym(1).qualifier = QualifiedTypeAST::Smooth;
1635 interpolation_qualifier ::= FLAT ;
1637 case $rule_number: {
1638 sym(1).qualifier = QualifiedTypeAST::Flat;
1642 interpolation_qualifier ::= NOPERSPECTIVE ;
1644 case $rule_number: {
1645 sym(1).qualifier = QualifiedTypeAST::NoPerspective;
1649 layout_qualifier ::= LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN ;
1651 case $rule_number: {
1656 layout_qualifier_id_list ::= layout_qualifier_id ;
1658 case $rule_number: {
1659 sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout);
1663 layout_qualifier_id_list ::= layout_qualifier_id_list COMMA layout_qualifier_id ;
1665 case $rule_number: {
1666 sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout_list, sym(3).layout);
1670 layout_qualifier_id ::= IDENTIFIER ;
1672 case $rule_number: {
1673 sym(1).layout = makeAstNode<LayoutQualifier>(string(1), (const QString *)0);
1677 layout_qualifier_id ::= IDENTIFIER EQUAL NUMBER ;
1679 case $rule_number: {
1680 sym(1).layout = makeAstNode<LayoutQualifier>(string(1), string(3));
1684 parameter_type_qualifier ::= CONST ;
1686 case $rule_number: {
1687 sym(1).qualifier = QualifiedTypeAST::Const;
1691 type_qualifier ::= storage_qualifier ;
1693 case $rule_number: {
1694 sym(1).type_qualifier.qualifier = sym(1).qualifier;
1695 sym(1).type_qualifier.layout_list = 0;
1699 type_qualifier ::= layout_qualifier ;
1701 case $rule_number: {
1702 sym(1).type_qualifier.layout_list = sym(1).layout_list;
1703 sym(1).type_qualifier.qualifier = 0;
1707 type_qualifier ::= layout_qualifier storage_qualifier ;
1709 case $rule_number: {
1710 sym(1).type_qualifier.layout_list = sym(1).layout_list;
1711 sym(1).type_qualifier.qualifier = sym(2).qualifier;
1715 type_qualifier ::= interpolation_qualifier storage_qualifier ;
1717 case $rule_number: {
1718 sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier;
1719 sym(1).type_qualifier.layout_list = 0;
1723 type_qualifier ::= interpolation_qualifier ;
1725 case $rule_number: {
1726 sym(1).type_qualifier.qualifier = sym(1).qualifier;
1727 sym(1).type_qualifier.layout_list = 0;
1731 type_qualifier ::= invariant_qualifier storage_qualifier ;
1733 case $rule_number: {
1734 sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier;
1735 sym(1).type_qualifier.layout_list = 0;
1739 type_qualifier ::= invariant_qualifier interpolation_qualifier storage_qualifier ;
1741 case $rule_number: {
1742 sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier | sym(3).qualifier;
1743 sym(1).type_qualifier.layout_list = 0;
1747 type_qualifier ::= INVARIANT ;
1749 case $rule_number: {
1750 sym(1).type_qualifier.qualifier = QualifiedTypeAST::Invariant;
1751 sym(1).type_qualifier.layout_list = 0;
1755 storage_qualifier ::= CONST ;
1757 case $rule_number: {
1758 sym(1).qualifier = QualifiedTypeAST::Const;
1762 storage_qualifier ::= ATTRIBUTE ;
1764 case $rule_number: {
1765 sym(1).qualifier = QualifiedTypeAST::Attribute;
1769 storage_qualifier ::= VARYING ;
1771 case $rule_number: {
1772 sym(1).qualifier = QualifiedTypeAST::Varying;
1776 storage_qualifier ::= CENTROID VARYING ;
1778 case $rule_number: {
1779 sym(1).qualifier = QualifiedTypeAST::CentroidVarying;
1783 storage_qualifier ::= IN ;
1785 case $rule_number: {
1786 sym(1).qualifier = QualifiedTypeAST::In;
1790 storage_qualifier ::= OUT ;
1792 case $rule_number: {
1793 sym(1).qualifier = QualifiedTypeAST::Out;
1797 storage_qualifier ::= CENTROID IN ;
1799 case $rule_number: {
1800 sym(1).qualifier = QualifiedTypeAST::CentroidIn;
1804 storage_qualifier ::= CENTROID OUT ;
1806 case $rule_number: {
1807 sym(1).qualifier = QualifiedTypeAST::CentroidOut;
1811 storage_qualifier ::= PATCH IN ;
1813 case $rule_number: {
1814 sym(1).qualifier = QualifiedTypeAST::PatchIn;
1818 storage_qualifier ::= PATCH OUT ;
1820 case $rule_number: {
1821 sym(1).qualifier = QualifiedTypeAST::PatchOut;
1825 storage_qualifier ::= SAMPLE IN ;
1827 case $rule_number: {
1828 sym(1).qualifier = QualifiedTypeAST::SampleIn;
1832 storage_qualifier ::= SAMPLE OUT ;
1834 case $rule_number: {
1835 sym(1).qualifier = QualifiedTypeAST::SampleOut;
1839 storage_qualifier ::= UNIFORM ;
1841 case $rule_number: {
1842 sym(1).qualifier = QualifiedTypeAST::Uniform;
1846 type_specifier ::= type_specifier_no_prec ;
1848 case $rule_number: {
1853 type_specifier ::= precision_qualifier type_specifier_no_prec ;
1855 case $rule_number: {
1856 if (!type(2)->setPrecision(sym(1).precision)) {
1857 // TODO: issue an error about precision not allowed on this type.
1863 type_specifier_no_prec ::= type_specifier_nonarray ;
1865 case $rule_number: {
1870 type_specifier_no_prec ::= type_specifier_nonarray LEFT_BRACKET RIGHT_BRACKET ;
1872 case $rule_number: {
1873 ast(1) = makeAstNode<ArrayTypeAST>(type(1));
1877 type_specifier_no_prec ::= type_specifier_nonarray LEFT_BRACKET constant_expression RIGHT_BRACKET ;
1879 case $rule_number: {
1880 ast(1) = makeAstNode<ArrayTypeAST>(type(1), expression(3));
1884 type_specifier_nonarray ::= VOID ;
1886 case $rule_number: {
1887 ast(1) = makeBasicType(T_VOID);
1891 type_specifier_nonarray ::= FLOAT ;
1893 case $rule_number: {
1894 ast(1) = makeBasicType(T_FLOAT);
1898 type_specifier_nonarray ::= DOUBLE ;
1900 case $rule_number: {
1901 ast(1) = makeBasicType(T_DOUBLE);
1905 type_specifier_nonarray ::= INT ;
1907 case $rule_number: {
1908 ast(1) = makeBasicType(T_INT);
1912 type_specifier_nonarray ::= UINT ;
1914 case $rule_number: {
1915 ast(1) = makeBasicType(T_UINT);
1919 type_specifier_nonarray ::= BOOL ;
1921 case $rule_number: {
1922 ast(1) = makeBasicType(T_BOOL);
1926 type_specifier_nonarray ::= VEC2 ;
1928 case $rule_number: {
1929 ast(1) = makeBasicType(T_VEC2);
1933 type_specifier_nonarray ::= VEC3 ;
1935 case $rule_number: {
1936 ast(1) = makeBasicType(T_VEC3);
1940 type_specifier_nonarray ::= VEC4 ;
1942 case $rule_number: {
1943 ast(1) = makeBasicType(T_VEC4);
1947 type_specifier_nonarray ::= DVEC2 ;
1949 case $rule_number: {
1950 ast(1) = makeBasicType(T_DVEC2);
1954 type_specifier_nonarray ::= DVEC3 ;
1956 case $rule_number: {
1957 ast(1) = makeBasicType(T_DVEC3);
1961 type_specifier_nonarray ::= DVEC4 ;
1963 case $rule_number: {
1964 ast(1) = makeBasicType(T_DVEC4);
1968 type_specifier_nonarray ::= BVEC2 ;
1970 case $rule_number: {
1971 ast(1) = makeBasicType(T_BVEC2);
1975 type_specifier_nonarray ::= BVEC3 ;
1977 case $rule_number: {
1978 ast(1) = makeBasicType(T_BVEC3);
1982 type_specifier_nonarray ::= BVEC4 ;
1984 case $rule_number: {
1985 ast(1) = makeBasicType(T_BVEC4);
1989 type_specifier_nonarray ::= IVEC2 ;
1991 case $rule_number: {
1992 ast(1) = makeBasicType(T_IVEC2);
1996 type_specifier_nonarray ::= IVEC3 ;
1998 case $rule_number: {
1999 ast(1) = makeBasicType(T_IVEC3);
2003 type_specifier_nonarray ::= IVEC4 ;
2005 case $rule_number: {
2006 ast(1) = makeBasicType(T_IVEC4);
2010 type_specifier_nonarray ::= UVEC2 ;
2012 case $rule_number: {
2013 ast(1) = makeBasicType(T_UVEC2);
2017 type_specifier_nonarray ::= UVEC3 ;
2019 case $rule_number: {
2020 ast(1) = makeBasicType(T_UVEC3);
2024 type_specifier_nonarray ::= UVEC4 ;
2026 case $rule_number: {
2027 ast(1) = makeBasicType(T_UVEC4);
2031 type_specifier_nonarray ::= MAT2 ;
2033 case $rule_number: {
2034 ast(1) = makeBasicType(T_MAT2);
2038 type_specifier_nonarray ::= MAT3 ;
2040 case $rule_number: {
2041 ast(1) = makeBasicType(T_MAT3);
2045 type_specifier_nonarray ::= MAT4 ;
2047 case $rule_number: {
2048 ast(1) = makeBasicType(T_MAT4);
2052 type_specifier_nonarray ::= MAT2X2 ;
2054 case $rule_number: {
2055 ast(1) = makeBasicType(T_MAT2);
2059 type_specifier_nonarray ::= MAT2X3 ;
2061 case $rule_number: {
2062 ast(1) = makeBasicType(T_MAT2X3);
2066 type_specifier_nonarray ::= MAT2X4 ;
2068 case $rule_number: {
2069 ast(1) = makeBasicType(T_MAT2X4);
2073 type_specifier_nonarray ::= MAT3X2 ;
2075 case $rule_number: {
2076 ast(1) = makeBasicType(T_MAT3X2);
2080 type_specifier_nonarray ::= MAT3X3 ;
2082 case $rule_number: {
2083 ast(1) = makeBasicType(T_MAT3);
2087 type_specifier_nonarray ::= MAT3X4 ;
2089 case $rule_number: {
2090 ast(1) = makeBasicType(T_MAT3X4);
2094 type_specifier_nonarray ::= MAT4X2 ;
2096 case $rule_number: {
2097 ast(1) = makeBasicType(T_MAT4X2);
2101 type_specifier_nonarray ::= MAT4X3 ;
2103 case $rule_number: {
2104 ast(1) = makeBasicType(T_MAT4X3);
2108 type_specifier_nonarray ::= MAT4X4 ;
2110 case $rule_number: {
2111 ast(1) = makeBasicType(T_MAT4);
2115 type_specifier_nonarray ::= DMAT2 ;
2117 case $rule_number: {
2118 ast(1) = makeBasicType(T_DMAT2);
2122 type_specifier_nonarray ::= DMAT3 ;
2124 case $rule_number: {
2125 ast(1) = makeBasicType(T_DMAT3);
2129 type_specifier_nonarray ::= DMAT4 ;
2131 case $rule_number: {
2132 ast(1) = makeBasicType(T_DMAT4);
2136 type_specifier_nonarray ::= DMAT2X2 ;
2138 case $rule_number: {
2139 ast(1) = makeBasicType(T_DMAT2);
2143 type_specifier_nonarray ::= DMAT2X3 ;
2145 case $rule_number: {
2146 ast(1) = makeBasicType(T_DMAT2X3);
2150 type_specifier_nonarray ::= DMAT2X4 ;
2152 case $rule_number: {
2153 ast(1) = makeBasicType(T_DMAT2X4);
2157 type_specifier_nonarray ::= DMAT3X2 ;
2159 case $rule_number: {
2160 ast(1) = makeBasicType(T_DMAT3X2);
2164 type_specifier_nonarray ::= DMAT3X3 ;
2166 case $rule_number: {
2167 ast(1) = makeBasicType(T_DMAT3);
2171 type_specifier_nonarray ::= DMAT3X4 ;
2173 case $rule_number: {
2174 ast(1) = makeBasicType(T_DMAT3X4);
2178 type_specifier_nonarray ::= DMAT4X2 ;
2180 case $rule_number: {
2181 ast(1) = makeBasicType(T_DMAT4X2);
2185 type_specifier_nonarray ::= DMAT4X3 ;
2187 case $rule_number: {
2188 ast(1) = makeBasicType(T_DMAT4X3);
2192 type_specifier_nonarray ::= DMAT4X4 ;
2194 case $rule_number: {
2195 ast(1) = makeBasicType(T_DMAT4);
2199 type_specifier_nonarray ::= SAMPLER1D ;
2201 case $rule_number: {
2202 ast(1) = makeBasicType(T_SAMPLER1D);
2206 type_specifier_nonarray ::= SAMPLER2D ;
2208 case $rule_number: {
2209 ast(1) = makeBasicType(T_SAMPLER2D);
2213 type_specifier_nonarray ::= SAMPLER3D ;
2215 case $rule_number: {
2216 ast(1) = makeBasicType(T_SAMPLER3D);
2220 type_specifier_nonarray ::= SAMPLERCUBE ;
2222 case $rule_number: {
2223 ast(1) = makeBasicType(T_SAMPLERCUBE);
2227 type_specifier_nonarray ::= SAMPLER1DSHADOW ;
2229 case $rule_number: {
2230 ast(1) = makeBasicType(T_SAMPLER1DSHADOW);
2234 type_specifier_nonarray ::= SAMPLER2DSHADOW ;
2236 case $rule_number: {
2237 ast(1) = makeBasicType(T_SAMPLER2DSHADOW);
2241 type_specifier_nonarray ::= SAMPLERCUBESHADOW ;
2243 case $rule_number: {
2244 ast(1) = makeBasicType(T_SAMPLERCUBESHADOW);
2248 type_specifier_nonarray ::= SAMPLER1DARRAY ;
2250 case $rule_number: {
2251 ast(1) = makeBasicType(T_SAMPLER1DARRAY);
2255 type_specifier_nonarray ::= SAMPLER2DARRAY ;
2257 case $rule_number: {
2258 ast(1) = makeBasicType(T_SAMPLER2DARRAY);
2262 type_specifier_nonarray ::= SAMPLER1DARRAYSHADOW ;
2264 case $rule_number: {
2265 ast(1) = makeBasicType(T_SAMPLER1DARRAYSHADOW);
2269 type_specifier_nonarray ::= SAMPLER2DARRAYSHADOW ;
2271 case $rule_number: {
2272 ast(1) = makeBasicType(T_SAMPLER2DARRAYSHADOW);
2276 type_specifier_nonarray ::= SAMPLERCUBEARRAY ;
2278 case $rule_number: {
2279 ast(1) = makeBasicType(T_SAMPLERCUBEARRAY);
2283 type_specifier_nonarray ::= SAMPLERCUBEARRAYSHADOW ;
2285 case $rule_number: {
2286 ast(1) = makeBasicType(T_SAMPLERCUBEARRAYSHADOW);
2290 type_specifier_nonarray ::= ISAMPLER1D ;
2292 case $rule_number: {
2293 ast(1) = makeBasicType(T_ISAMPLER1D);
2297 type_specifier_nonarray ::= ISAMPLER2D ;
2299 case $rule_number: {
2300 ast(1) = makeBasicType(T_ISAMPLER2D);
2304 type_specifier_nonarray ::= ISAMPLER3D ;
2306 case $rule_number: {
2307 ast(1) = makeBasicType(T_ISAMPLER3D);
2311 type_specifier_nonarray ::= ISAMPLERCUBE ;
2313 case $rule_number: {
2314 ast(1) = makeBasicType(T_ISAMPLERCUBE);
2318 type_specifier_nonarray ::= ISAMPLER1DARRAY ;
2320 case $rule_number: {
2321 ast(1) = makeBasicType(T_ISAMPLER1DARRAY);
2325 type_specifier_nonarray ::= ISAMPLER2DARRAY ;
2327 case $rule_number: {
2328 ast(1) = makeBasicType(T_ISAMPLER2DARRAY);
2332 type_specifier_nonarray ::= ISAMPLERCUBEARRAY ;
2334 case $rule_number: {
2335 ast(1) = makeBasicType(T_ISAMPLERCUBEARRAY);
2339 type_specifier_nonarray ::= USAMPLER1D ;
2341 case $rule_number: {
2342 ast(1) = makeBasicType(T_USAMPLER1D);
2346 type_specifier_nonarray ::= USAMPLER2D ;
2348 case $rule_number: {
2349 ast(1) = makeBasicType(T_USAMPLER2D);
2353 type_specifier_nonarray ::= USAMPLER3D ;
2355 case $rule_number: {
2356 ast(1) = makeBasicType(T_USAMPLER3D);
2360 type_specifier_nonarray ::= USAMPLERCUBE ;
2362 case $rule_number: {
2363 ast(1) = makeBasicType(T_USAMPLERCUBE);
2367 type_specifier_nonarray ::= USAMPLER1DARRAY ;
2369 case $rule_number: {
2370 ast(1) = makeBasicType(T_USAMPLER1DARRAY);
2374 type_specifier_nonarray ::= USAMPLER2DARRAY ;
2376 case $rule_number: {
2377 ast(1) = makeBasicType(T_USAMPLER2DARRAY);
2381 type_specifier_nonarray ::= USAMPLERCUBEARRAY ;
2383 case $rule_number: {
2384 ast(1) = makeBasicType(T_USAMPLERCUBEARRAY);
2388 type_specifier_nonarray ::= SAMPLER2DRECT ;
2390 case $rule_number: {
2391 ast(1) = makeBasicType(T_SAMPLER2DRECT);
2395 type_specifier_nonarray ::= SAMPLER2DRECTSHADOW ;
2397 case $rule_number: {
2398 ast(1) = makeBasicType(T_SAMPLER2DRECTSHADOW);
2402 type_specifier_nonarray ::= ISAMPLER2DRECT ;
2404 case $rule_number: {
2405 ast(1) = makeBasicType(T_ISAMPLER2DRECT);
2409 type_specifier_nonarray ::= USAMPLER2DRECT ;
2411 case $rule_number: {
2412 ast(1) = makeBasicType(T_USAMPLER2DRECT);
2416 type_specifier_nonarray ::= SAMPLERBUFFER ;
2418 case $rule_number: {
2419 ast(1) = makeBasicType(T_SAMPLERBUFFER);
2423 type_specifier_nonarray ::= ISAMPLERBUFFER ;
2425 case $rule_number: {
2426 ast(1) = makeBasicType(T_ISAMPLERBUFFER);
2430 type_specifier_nonarray ::= USAMPLERBUFFER ;
2432 case $rule_number: {
2433 ast(1) = makeBasicType(T_USAMPLERBUFFER);
2437 type_specifier_nonarray ::= SAMPLER2DMS ;
2439 case $rule_number: {
2440 ast(1) = makeBasicType(T_SAMPLER2DMS);
2444 type_specifier_nonarray ::= ISAMPLER2DMS ;
2446 case $rule_number: {
2447 ast(1) = makeBasicType(T_ISAMPLER2DMS);
2451 type_specifier_nonarray ::= USAMPLER2DMS ;
2453 case $rule_number: {
2454 ast(1) = makeBasicType(T_USAMPLER2DMS);
2458 type_specifier_nonarray ::= SAMPLER2DMSARRAY ;
2460 case $rule_number: {
2461 ast(1) = makeBasicType(T_SAMPLER2DMSARRAY);
2465 type_specifier_nonarray ::= ISAMPLER2DMSARRAY ;
2467 case $rule_number: {
2468 ast(1) = makeBasicType(T_ISAMPLER2DMSARRAY);
2472 type_specifier_nonarray ::= USAMPLER2DMSARRAY ;
2474 case $rule_number: {
2475 ast(1) = makeBasicType(T_USAMPLER2DMSARRAY);
2479 type_specifier_nonarray ::= struct_specifier ;
2481 case $rule_number: {
2486 type_specifier_nonarray ::= TYPE_NAME ;
2488 case $rule_number: {
2489 ast(1) = makeAstNode<NamedTypeAST>(string(1));
2493 precision_qualifier ::= HIGHP ;
2495 case $rule_number: {
2496 sym(1).precision = TypeAST::Highp;
2500 precision_qualifier ::= MEDIUMP ;
2502 case $rule_number: {
2503 sym(1).precision = TypeAST::Mediump;
2507 precision_qualifier ::= LOWP ;
2509 case $rule_number: {
2510 sym(1).precision = TypeAST::Lowp;
2514 struct_specifier ::= STRUCT IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE ;
2516 case $rule_number: {
2517 ast(1) = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
2521 struct_specifier ::= STRUCT LEFT_BRACE struct_declaration_list RIGHT_BRACE ;
2523 case $rule_number: {
2524 ast(1) = makeAstNode<StructTypeAST>(sym(3).field_list);
2528 struct_declaration_list ::= struct_declaration ;
2530 case $rule_number: {
2535 struct_declaration_list ::= struct_declaration_list struct_declaration ;
2537 case $rule_number: {
2538 sym(1).field_list = appendLists(sym(1).field_list, sym(2).field_list);
2542 struct_declaration ::= type_specifier struct_declarator_list SEMICOLON ;
2544 case $rule_number: {
2545 sym(1).field_list = StructTypeAST::fixInnerTypes(type(1), sym(2).field_list);
2549 struct_declaration ::= type_qualifier type_specifier struct_declarator_list SEMICOLON ;
2551 case $rule_number: {
2552 sym(1).field_list = StructTypeAST::fixInnerTypes
2553 (makeAstNode<QualifiedTypeAST>
2554 (sym(1).type_qualifier.qualifier, type(2),
2555 sym(1).type_qualifier.layout_list), sym(3).field_list);
2559 struct_declarator_list ::= struct_declarator ;
2561 case $rule_number: {
2563 sym(1).field_list = makeAstNode< List<StructTypeAST::Field *> >(sym(1).field);
2567 struct_declarator_list ::= struct_declarator_list COMMA struct_declarator ;
2569 case $rule_number: {
2570 sym(1).field_list = makeAstNode< List<StructTypeAST::Field *> >(sym(1).field_list, sym(3).field);
2574 struct_declarator ::= IDENTIFIER ;
2576 case $rule_number: {
2577 sym(1).field = makeAstNode<StructTypeAST::Field>(string(1));
2581 struct_declarator ::= IDENTIFIER LEFT_BRACKET RIGHT_BRACKET ;
2583 case $rule_number: {
2584 sym(1).field = makeAstNode<StructTypeAST::Field>
2585 (string(1), makeAstNode<ArrayTypeAST>((TypeAST *)0));
2589 struct_declarator ::= IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET ;
2591 case $rule_number: {
2592 sym(1).field = makeAstNode<StructTypeAST::Field>
2593 (string(1), makeAstNode<ArrayTypeAST>((TypeAST *)0, expression(3)));
2597 initializer ::= assignment_expression ;
2599 case $rule_number: {
2604 declaration_statement ::= declaration ;
2606 case $rule_number: {
2607 ast(1) = makeAstNode<DeclarationStatementAST>(sym(1).declaration);
2611 statement ::= compound_statement ;
2613 case $rule_number: {
2618 statement ::= simple_statement ;
2620 case $rule_number: {
2625 simple_statement ::= declaration_statement ;
2627 case $rule_number: {
2632 simple_statement ::= expression_statement ;
2634 case $rule_number: {
2639 simple_statement ::= selection_statement ;
2641 case $rule_number: {
2646 simple_statement ::= switch_statement ;
2648 case $rule_number: {
2653 simple_statement ::= case_label ;
2655 case $rule_number: {
2660 simple_statement ::= iteration_statement ;
2662 case $rule_number: {
2667 simple_statement ::= jump_statement ;
2669 case $rule_number: {
2674 compound_statement ::= LEFT_BRACE RIGHT_BRACE ;
2676 case $rule_number: {
2677 CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>();
2678 stmt->start = tokenAt(location(1)).begin();
2679 stmt->end = tokenAt(location(2)).end();
2684 compound_statement ::= LEFT_BRACE statement_list RIGHT_BRACE ;
2686 case $rule_number: {
2687 CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>(sym(2).statement_list);
2688 stmt->start = tokenAt(location(1)).begin();
2689 stmt->end = tokenAt(location(3)).end();
2694 statement_no_new_scope ::= compound_statement_no_new_scope ;
2696 case $rule_number: {
2701 statement_no_new_scope ::= simple_statement ;
2703 case $rule_number: {
2708 compound_statement_no_new_scope ::= LEFT_BRACE RIGHT_BRACE ;
2710 case $rule_number: {
2711 CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>();
2712 stmt->start = tokenAt(location(1)).begin();
2713 stmt->end = tokenAt(location(2)).end();
2718 compound_statement_no_new_scope ::= LEFT_BRACE statement_list RIGHT_BRACE ;
2720 case $rule_number: {
2721 CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>(sym(2).statement_list);
2722 stmt->start = tokenAt(location(1)).begin();
2723 stmt->end = tokenAt(location(3)).end();
2728 statement_list ::= statement ;
2730 case $rule_number: {
2731 sym(1).statement_list = makeAstNode< List<StatementAST *> >(sym(1).statement);
2735 statement_list ::= statement_list statement ;
2737 case $rule_number: {
2738 sym(1).statement_list = makeAstNode< List<StatementAST *> >(sym(1).statement_list, sym(2).statement);
2742 expression_statement ::= SEMICOLON ;
2744 case $rule_number: {
2745 ast(1) = makeAstNode<CompoundStatementAST>(); // Empty statement
2749 expression_statement ::= expression SEMICOLON ;
2751 case $rule_number: {
2752 ast(1) = makeAstNode<ExpressionStatementAST>(expression(1));
2756 selection_statement ::= IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement ;
2758 case $rule_number: {
2759 ast(1) = makeAstNode<IfStatementAST>(expression(3), sym(5).ifstmt.thenClause, sym(5).ifstmt.elseClause);
2763 selection_rest_statement ::= statement ELSE statement ;
2765 case $rule_number: {
2766 sym(1).ifstmt.thenClause = statement(1);
2767 sym(1).ifstmt.elseClause = statement(3);
2771 selection_rest_statement ::= statement ;
2773 case $rule_number: {
2774 sym(1).ifstmt.thenClause = statement(1);
2775 sym(1).ifstmt.elseClause = 0;
2779 condition ::= expression ;
2781 case $rule_number: {
2786 condition ::= fully_specified_type IDENTIFIER EQUAL initializer ;
2788 case $rule_number: {
2789 ast(1) = makeAstNode<DeclarationExpressionAST>
2790 (type(1), string(2), expression(4));
2794 switch_statement ::= SWITCH LEFT_PAREN expression RIGHT_PAREN LEFT_BRACE switch_statement_list RIGHT_BRACE ;
2796 case $rule_number: {
2797 ast(1) = makeAstNode<SwitchStatementAST>(expression(3), statement(6));
2801 switch_statement_list ::= empty ;
2803 case $rule_number: {
2804 ast(1) = makeAstNode<CompoundStatementAST>();
2808 switch_statement_list ::= statement_list ;
2810 case $rule_number: {
2811 ast(1) = makeAstNode<CompoundStatementAST>(sym(1).statement_list);
2815 case_label ::= CASE expression COLON ;
2817 case $rule_number: {
2818 ast(1) = makeAstNode<CaseLabelStatementAST>(expression(2));
2822 case_label ::= DEFAULT COLON ;
2824 case $rule_number: {
2825 ast(1) = makeAstNode<CaseLabelStatementAST>();
2829 iteration_statement ::= WHILE LEFT_PAREN condition RIGHT_PAREN statement_no_new_scope ;
2831 case $rule_number: {
2832 ast(1) = makeAstNode<WhileStatementAST>(expression(3), statement(5));
2836 iteration_statement ::= DO statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON ;
2838 case $rule_number: {
2839 ast(1) = makeAstNode<DoStatementAST>(statement(2), expression(5));
2843 iteration_statement ::= FOR LEFT_PAREN for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope ;
2845 case $rule_number: {
2846 ast(1) = makeAstNode<ForStatementAST>(statement(3), sym(4).forstmt.condition, sym(4).forstmt.increment, statement(6));
2850 for_init_statement ::= expression_statement ;
2852 case $rule_number: {
2857 for_init_statement ::= declaration_statement ;
2859 case $rule_number: {
2864 conditionopt ::= empty ;
2866 case $rule_number: {
2871 conditionopt ::= condition ;
2873 case $rule_number: {
2878 for_rest_statement ::= conditionopt SEMICOLON ;
2880 case $rule_number: {
2881 sym(1).forstmt.condition = expression(1);
2882 sym(1).forstmt.increment = 0;
2886 for_rest_statement ::= conditionopt SEMICOLON expression ;
2888 case $rule_number: {
2889 sym(1).forstmt.condition = expression(1);
2890 sym(1).forstmt.increment = expression(3);
2894 jump_statement ::= CONTINUE SEMICOLON ;
2896 case $rule_number: {
2897 ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Continue);
2901 jump_statement ::= BREAK SEMICOLON ;
2903 case $rule_number: {
2904 ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Break);
2908 jump_statement ::= RETURN SEMICOLON ;
2910 case $rule_number: {
2911 ast(1) = makeAstNode<ReturnStatementAST>();
2915 jump_statement ::= RETURN expression SEMICOLON ;
2917 case $rule_number: {
2918 ast(1) = makeAstNode<ReturnStatementAST>(expression(2));
2922 jump_statement ::= DISCARD SEMICOLON ;
2924 case $rule_number: {
2925 ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Discard);
2929 translation_unit ::= external_declaration_list ;
2931 case $rule_number: {
2932 ast(1) = makeAstNode<TranslationUnitAST>(sym(1).declaration_list);
2936 external_declaration_list ::= external_declaration ;
2938 case $rule_number: {
2939 if (sym(1).declaration) {
2940 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
2941 (sym(1).declaration);
2943 sym(1).declaration_list = 0;
2948 external_declaration_list ::= external_declaration_list external_declaration ;
2950 case $rule_number: {
2951 if (sym(1).declaration_list && sym(2).declaration) {
2952 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
2953 (sym(1).declaration_list, sym(2).declaration);
2954 } else if (!sym(1).declaration_list) {
2955 if (sym(2).declaration) {
2956 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
2957 (sym(2).declaration);
2959 sym(1).declaration_list = 0;
2965 external_declaration ::= function_definition ;
2967 case $rule_number: {
2972 external_declaration ::= declaration ;
2974 case $rule_number: {
2979 external_declaration ::= SEMICOLON ;
2981 case $rule_number: {
2986 function_definition ::= function_prototype compound_statement_no_new_scope ;
2988 case $rule_number: {
2989 function(1)->body = statement(2);
2995 case $rule_number: {
3001 toplevel ::= FEED_GLSL translation_unit ;
3003 case $rule_number: {
3008 toplevel ::= FEED_EXPRESSION expression ;
3010 case $rule_number: {
3017 } // end Parser::reduce()