4 /**************************************************************************
6 ** This file is part of Qt Creator
8 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
10 ** Contact: Nokia Corporation (qt-info@nokia.com)
12 ** No Commercial Usage
14 ** This file contains pre-release code and may not be distributed.
15 ** You may use this file in accordance with the terms and conditions
16 ** contained in the Technology Preview License Agreement accompanying
19 ** GNU Lesser General Public License Usage
21 ** Alternatively, this file may be used under the terms of the GNU Lesser
22 ** General Public License version 2.1 as published by the Free Software
23 ** Foundation and appearing in the file LICENSE.LGPL included in the
24 ** packaging of this file. Please review the following information to
25 ** ensure the GNU Lesser General Public License version 2.1 requirements
26 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
28 ** In addition, as a special exception, Nokia gives you certain additional
29 ** rights. These rights are described in the Nokia Qt LGPL Exception
30 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
32 ** If you have questions regarding the use of this file, please contact
33 ** Nokia at qt-info@nokia.com.
35 **************************************************************************/
37 #include "glslparser.h"
38 #include "glslengine.h"
42 #include <QtCore/QDebug>
46 Parser::Parser(Engine *engine, const char *source, unsigned size, int variant)
47 : _engine(engine), _tos(-1), _index(0), yyloc(-1), yytoken(-1), yyrecovering(0), _recovered(false)
49 _tokens.reserve(1024);
51 _stateStack.resize(128);
52 _locationStack.resize(128);
53 _symStack.resize(128);
55 _tokens.push_back(Token()); // invalid token
57 std::stack<int> parenStack;
58 std::stack<int> bracketStack;
59 std::stack<int> braceStack;
61 Lexer lexer(engine, source, size);
62 lexer.setVariant(variant);
69 parenStack.push(_tokens.size());
72 bracketStack.push(_tokens.size());
75 braceStack.push(_tokens.size());
79 if (! parenStack.empty()) {
80 _tokens[parenStack.top()].matchingBrace = _tokens.size();
85 if (! bracketStack.empty()) {
86 _tokens[bracketStack.top()].matchingBrace = _tokens.size();
91 if (! braceStack.empty()) {
92 _tokens[braceStack.top()].matchingBrace = _tokens.size();
100 _tokens.push_back(tk);
101 } while (tk.isNot(EOF_SYMBOL));
110 AST *Parser::parse(int startToken)
115 void *yyval = 0; // value of the current token.
119 _startToken.kind = startToken;
123 if (unsigned(++_tos) == _stateStack.size()) {
124 _stateStack.resize(_tos * 2);
125 _locationStack.resize(_tos * 2);
126 _symStack.resize(_tos * 2);
129 _stateStack[_tos] = action;
131 if (yytoken == -1 && -TERMINAL_COUNT != action_index[action]) {
132 yyloc = consumeToken();
133 yytoken = tokenKind(yyloc);
136 if (yytoken == T_IDENTIFIER && t_action(action, T_TYPE_NAME) != 0) {
137 const Token &la = tokenAt(_index);
139 if (la.is(T_IDENTIFIER)) {
140 yytoken = T_TYPE_NAME;
141 } else if (la.is(T_LEFT_BRACKET) && la.matchingBrace != 0 &&
142 tokenAt(la.matchingBrace + 1).is(T_IDENTIFIER)) {
143 yytoken = T_TYPE_NAME;
146 yyval = _tokens.at(yyloc).ptr;
149 action = t_action(action, yytoken);
151 if (action == ACCEPT_STATE) {
153 return _symStack[0].translation_unit;
155 _symStack[_tos].ptr = yyval;
156 _locationStack[_tos] = yyloc;
158 } else if (action < 0) {
159 const int ruleno = -action - 1;
160 const int N = rhs[ruleno];
163 action = nt_action(_stateStack[_tos], lhs[ruleno] - TERMINAL_COUNT);
164 } else if (action == 0) {
165 const int line = _tokens[yyloc].line + 1;
166 QString message = QLatin1String("Syntax error");
168 const QLatin1String s(spell[yytoken]);
169 message = QString("Unexpected token `%1'").arg(s);
172 for (; _tos; --_tos) {
173 const int state = _stateStack[_tos];
176 T_RIGHT_BRACE, T_RIGHT_PAREN, T_RIGHT_BRACKET,
177 T_SEMICOLON, T_COMMA, T_COLON,
178 T_NUMBER, T_TYPE_NAME, T_IDENTIFIER,
179 T_LEFT_BRACE, T_LEFT_PAREN, T_LEFT_BRACKET,
184 for (int *tptr = tks; *tptr; ++tptr) {
185 const int next = t_action(state, *tptr);
187 if (! yyrecovering && ! _recovered) {
189 error(line, QString("Expected `%1'").arg(QLatin1String(spell[*tptr])));
193 if (*tptr == T_IDENTIFIER)
194 yyval = (void *) _engine->identifier(QLatin1String("$identifier"));
195 else if (*tptr == T_NUMBER || *tptr == T_TYPE_NAME)
196 yyval = (void *) _engine->identifier(QLatin1String("$0"));
200 _symStack[_tos].ptr = yyval;
201 _locationStack[_tos] = yyloc;
212 error(line, message);
223 void Parser::reduce(int ruleno)
230 ast(1) = makeAstNode<IdentifierExpressionAST>(string(1));
236 ast(1) = makeAstNode<LiteralExpressionAST>(string(1));
242 ast(1) = makeAstNode<LiteralExpressionAST>(_engine->identifier("true", 4));
248 ast(1) = makeAstNode<LiteralExpressionAST>(_engine->identifier("false", 5));
272 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ArrayAccess, expression(1), expression(3));
284 ast(1) = makeAstNode<MemberAccessExpressionAST>(expression(1), string(3));
290 ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PostIncrement, expression(1));
296 ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PostDecrement, expression(1));
314 ast(1) = makeAstNode<FunctionCallExpressionAST>
315 (sym(1).function.id, sym(1).function.arguments);
321 ast(1) = makeAstNode<FunctionCallExpressionAST>
322 (expression(1), sym(3).function.id, sym(3).function.arguments);
340 sym(1).function.id = sym(1).function_identifier;
341 sym(1).function.arguments = 0;
347 sym(1).function.id = sym(1).function_identifier;
348 sym(1).function.arguments = 0;
354 sym(1).function.id = sym(1).function_identifier;
355 sym(1).function.arguments =
356 makeAstNode< List<ExpressionAST *> >(expression(2));
362 sym(1).function.arguments =
363 makeAstNode< List<ExpressionAST *> >
364 (sym(1).function.arguments, expression(3));
376 ast(1) = makeAstNode<FunctionIdentifierAST>(type(1));
382 ast(1) = makeAstNode<FunctionIdentifierAST>(string(1));
394 ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PreIncrement, expression(2));
400 ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PreDecrement, expression(2));
406 ast(1) = makeAstNode<UnaryExpressionAST>(sym(1).kind, expression(2));
412 sym(1).kind = AST::Kind_UnaryPlus;
418 sym(1).kind = AST::Kind_UnaryMinus;
424 sym(1).kind = AST::Kind_LogicalNot;
430 sym(1).kind = AST::Kind_BitwiseNot;
442 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Multiply, expression(1), expression(3));
448 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Divide, expression(1), expression(3));
454 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Modulus, expression(1), expression(3));
466 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Plus, expression(1), expression(3));
472 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Minus, expression(1), expression(3));
484 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ShiftLeft, expression(1), expression(3));
490 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ShiftRight, expression(1), expression(3));
502 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LessThan, expression(1), expression(3));
508 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_GreaterThan, expression(1), expression(3));
514 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LessEqual, expression(1), expression(3));
520 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_GreaterEqual, expression(1), expression(3));
532 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Equal, expression(1), expression(3));
535 #line 1004 "./glsl.g"
538 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_NotEqual, expression(1), expression(3));
541 #line 1011 "./glsl.g"
547 #line 1018 "./glsl.g"
550 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseAnd, expression(1), expression(3));
553 #line 1025 "./glsl.g"
559 #line 1032 "./glsl.g"
562 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseXor, expression(1), expression(3));
565 #line 1039 "./glsl.g"
571 #line 1046 "./glsl.g"
574 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseOr, expression(1), expression(3));
577 #line 1053 "./glsl.g"
583 #line 1060 "./glsl.g"
586 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalAnd, expression(1), expression(3));
589 #line 1067 "./glsl.g"
595 #line 1074 "./glsl.g"
598 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalXor, expression(1), expression(3));
601 #line 1081 "./glsl.g"
607 #line 1088 "./glsl.g"
610 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalOr, expression(1), expression(3));
613 #line 1095 "./glsl.g"
619 #line 1102 "./glsl.g"
622 ast(1) = makeAstNode<TernaryExpressionAST>(AST::Kind_Conditional, expression(1), expression(3), expression(5));
625 #line 1109 "./glsl.g"
631 #line 1116 "./glsl.g"
634 ast(1) = makeAstNode<AssignmentExpressionAST>(sym(2).kind, expression(1), expression(3));
637 #line 1123 "./glsl.g"
640 sym(1).kind = AST::Kind_Assign;
643 #line 1130 "./glsl.g"
646 sym(1).kind = AST::Kind_AssignMultiply;
649 #line 1137 "./glsl.g"
652 sym(1).kind = AST::Kind_AssignDivide;
655 #line 1144 "./glsl.g"
658 sym(1).kind = AST::Kind_AssignModulus;
661 #line 1151 "./glsl.g"
664 sym(1).kind = AST::Kind_AssignPlus;
667 #line 1158 "./glsl.g"
670 sym(1).kind = AST::Kind_AssignMinus;
673 #line 1165 "./glsl.g"
676 sym(1).kind = AST::Kind_AssignShiftLeft;
679 #line 1172 "./glsl.g"
682 sym(1).kind = AST::Kind_AssignShiftRight;
685 #line 1179 "./glsl.g"
688 sym(1).kind = AST::Kind_AssignAnd;
691 #line 1186 "./glsl.g"
694 sym(1).kind = AST::Kind_AssignXor;
697 #line 1193 "./glsl.g"
700 sym(1).kind = AST::Kind_AssignOr;
703 #line 1200 "./glsl.g"
709 #line 1207 "./glsl.g"
712 ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Comma, expression(1), expression(3));
715 #line 1214 "./glsl.g"
721 #line 1221 "./glsl.g"
727 #line 1228 "./glsl.g"
730 ast(1) = makeAstNode<InitDeclarationAST>(sym(1).declaration_list);
733 #line 1235 "./glsl.g"
736 ast(1) = makeAstNode<PrecisionDeclarationAST>(sym(2).precision, type(3));
739 #line 1242 "./glsl.g"
742 if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) {
743 // TODO: issue an error if the qualifier is not "struct".
745 TypeAST *type = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
746 ast(1) = makeAstNode<TypeDeclarationAST>(type);
749 #line 1253 "./glsl.g"
752 if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) {
753 // TODO: issue an error if the qualifier does not contain "struct".
755 TypeAST *type = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
756 TypeAST *qualtype = type;
757 if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) {
758 qualtype = makeAstNode<QualifiedTypeAST>
759 (sym(1).type_qualifier.qualifier & ~QualifiedTypeAST::Struct, qualtype,
760 sym(1).type_qualifier.layout_list);
762 ast(1) = makeAstNode<TypeAndVariableDeclarationAST>
763 (makeAstNode<TypeDeclarationAST>(type),
764 makeAstNode<VariableDeclarationAST>(qualtype, string(6)));
767 #line 1272 "./glsl.g"
770 if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) {
771 // TODO: issue an error if the qualifier does not contain "struct".
773 TypeAST *type = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
774 TypeAST *qualtype = type;
775 if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) {
776 qualtype = makeAstNode<QualifiedTypeAST>
777 (sym(1).type_qualifier.qualifier & ~QualifiedTypeAST::Struct, qualtype,
778 sym(1).type_qualifier.layout_list);
780 ast(1) = makeAstNode<TypeAndVariableDeclarationAST>
781 (makeAstNode<TypeDeclarationAST>(type),
782 makeAstNode<VariableDeclarationAST>
783 (makeAstNode<ArrayTypeAST>(qualtype), string(6)));
786 #line 1292 "./glsl.g"
789 if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) {
790 // TODO: issue an error if the qualifier does not contain "struct".
792 TypeAST *type = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
793 TypeAST *qualtype = type;
794 if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) {
795 qualtype = makeAstNode<QualifiedTypeAST>
796 (sym(1).type_qualifier.qualifier & ~QualifiedTypeAST::Struct, qualtype,
797 sym(1).type_qualifier.layout_list);
799 ast(1) = makeAstNode<TypeAndVariableDeclarationAST>
800 (makeAstNode<TypeDeclarationAST>(type),
801 makeAstNode<VariableDeclarationAST>
802 (makeAstNode<ArrayTypeAST>(qualtype, expression(8)), string(6)));
805 #line 1312 "./glsl.g"
808 TypeAST *type = makeAstNode<QualifiedTypeAST>
809 (sym(1).type_qualifier.qualifier, (TypeAST *)0,
810 sym(1).type_qualifier.layout_list);
811 ast(1) = makeAstNode<TypeDeclarationAST>(type);
814 #line 1322 "./glsl.g"
817 function(1)->finishParams();
820 #line 1329 "./glsl.g"
826 #line 1336 "./glsl.g"
832 #line 1343 "./glsl.g"
835 function(1)->params = makeAstNode< List<ParameterDeclarationAST *> >
836 (sym(2).param_declaration);
839 #line 1351 "./glsl.g"
842 function(1)->params = makeAstNode< List<ParameterDeclarationAST *> >
843 (function(1)->params, sym(3).param_declaration);
846 #line 1359 "./glsl.g"
849 function(1) = makeAstNode<FunctionDeclarationAST>(type(1), string(2));
852 #line 1366 "./glsl.g"
855 sym(1).param_declarator.type = type(1);
856 sym(1).param_declarator.name = string(2);
859 #line 1374 "./glsl.g"
862 sym(1).param_declarator.type = makeAstNode<ArrayTypeAST>(type(1), expression(4));
863 sym(1).param_declarator.name = string(2);
866 #line 1382 "./glsl.g"
869 ast(1) = makeAstNode<ParameterDeclarationAST>
870 (makeAstNode<QualifiedTypeAST>
871 (sym(1).qualifier, sym(3).param_declarator.type,
872 (List<LayoutQualifier *> *)0),
873 ParameterDeclarationAST::Qualifier(sym(2).qualifier),
874 sym(3).param_declarator.name);
877 #line 1394 "./glsl.g"
880 ast(1) = makeAstNode<ParameterDeclarationAST>
881 (sym(2).param_declarator.type,
882 ParameterDeclarationAST::Qualifier(sym(1).qualifier),
883 sym(2).param_declarator.name);
886 #line 1404 "./glsl.g"
889 ast(1) = makeAstNode<ParameterDeclarationAST>
890 (makeAstNode<QualifiedTypeAST>
891 (sym(1).qualifier, type(3), (List<LayoutQualifier *> *)0),
892 ParameterDeclarationAST::Qualifier(sym(2).qualifier),
896 #line 1415 "./glsl.g"
899 ast(1) = makeAstNode<ParameterDeclarationAST>
900 (type(2), ParameterDeclarationAST::Qualifier(sym(1).qualifier),
904 #line 1424 "./glsl.g"
907 sym(1).qualifier = ParameterDeclarationAST::In;
910 #line 1431 "./glsl.g"
913 sym(1).qualifier = ParameterDeclarationAST::In;
916 #line 1438 "./glsl.g"
919 sym(1).qualifier = ParameterDeclarationAST::Out;
922 #line 1445 "./glsl.g"
925 sym(1).qualifier = ParameterDeclarationAST::InOut;
928 #line 1452 "./glsl.g"
934 #line 1459 "./glsl.g"
937 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
938 (sym(1).declaration);
941 #line 1467 "./glsl.g"
944 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
945 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>(type, string(3));
946 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
947 (sym(1).declaration_list, decl);
950 #line 1477 "./glsl.g"
953 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
954 type = makeAstNode<ArrayTypeAST>(type);
955 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>(type, string(3));
956 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
957 (sym(1).declaration_list, decl);
960 #line 1488 "./glsl.g"
963 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
964 type = makeAstNode<ArrayTypeAST>(type, expression(5));
965 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>(type, string(3));
966 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
967 (sym(1).declaration_list, decl);
970 #line 1499 "./glsl.g"
973 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
974 type = makeAstNode<ArrayTypeAST>(type);
975 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>
976 (type, string(3), expression(7));
977 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
978 (sym(1).declaration_list, decl);
981 #line 1511 "./glsl.g"
984 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
985 type = makeAstNode<ArrayTypeAST>(type, expression(5));
986 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>
987 (type, string(3), expression(8));
988 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
989 (sym(1).declaration_list, decl);
992 #line 1523 "./glsl.g"
995 TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list);
996 DeclarationAST *decl = makeAstNode<VariableDeclarationAST>
997 (type, string(3), expression(5));
998 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
999 (sym(1).declaration_list, decl);
1002 #line 1534 "./glsl.g"
1005 ast(1) = makeAstNode<TypeDeclarationAST>(type(1));
1008 #line 1541 "./glsl.g"
1011 ast(1) = makeAstNode<VariableDeclarationAST>(type(1), string(2));
1014 #line 1548 "./glsl.g"
1017 ast(1) = makeAstNode<VariableDeclarationAST>
1018 (makeAstNode<ArrayTypeAST>(type(1)), string(2));
1021 #line 1556 "./glsl.g"
1024 ast(1) = makeAstNode<VariableDeclarationAST>
1025 (makeAstNode<ArrayTypeAST>(type(1), expression(4)), string(2));
1028 #line 1564 "./glsl.g"
1031 ast(1) = makeAstNode<VariableDeclarationAST>
1032 (makeAstNode<ArrayTypeAST>(type(1)), string(2), expression(6));
1035 #line 1572 "./glsl.g"
1038 ast(1) = makeAstNode<VariableDeclarationAST>
1039 (makeAstNode<ArrayTypeAST>(type(1), expression(4)),
1040 string(2), expression(7));
1043 #line 1581 "./glsl.g"
1046 ast(1) = makeAstNode<VariableDeclarationAST>
1047 (type(1), string(2), expression(4));
1050 #line 1589 "./glsl.g"
1053 ast(1) = makeAstNode<InvariantDeclarationAST>(string(2));
1056 #line 1596 "./glsl.g"
1059 ast(1) = makeAstNode<QualifiedTypeAST>(0, type(1), (List<LayoutQualifier *> *)0);
1062 #line 1603 "./glsl.g"
1065 ast(1) = makeAstNode<QualifiedTypeAST>
1066 (sym(1).type_qualifier.qualifier, type(2),
1067 sym(1).type_qualifier.layout_list);
1070 #line 1612 "./glsl.g"
1073 sym(1).qualifier = QualifiedTypeAST::Invariant;
1076 #line 1619 "./glsl.g"
1079 sym(1).qualifier = QualifiedTypeAST::Smooth;
1082 #line 1626 "./glsl.g"
1085 sym(1).qualifier = QualifiedTypeAST::Flat;
1088 #line 1633 "./glsl.g"
1091 sym(1).qualifier = QualifiedTypeAST::NoPerspective;
1094 #line 1640 "./glsl.g"
1100 #line 1647 "./glsl.g"
1103 sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout);
1106 #line 1654 "./glsl.g"
1109 sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout_list, sym(3).layout);
1112 #line 1661 "./glsl.g"
1115 sym(1).layout = makeAstNode<LayoutQualifier>(string(1), (const QString *)0);
1118 #line 1668 "./glsl.g"
1121 sym(1).layout = makeAstNode<LayoutQualifier>(string(1), string(3));
1124 #line 1675 "./glsl.g"
1127 sym(1).qualifier = QualifiedTypeAST::Const;
1130 #line 1682 "./glsl.g"
1133 sym(1).type_qualifier.qualifier = sym(1).qualifier;
1134 sym(1).type_qualifier.layout_list = 0;
1137 #line 1690 "./glsl.g"
1140 sym(1).type_qualifier.layout_list = sym(1).layout_list;
1141 sym(1).type_qualifier.qualifier = 0;
1144 #line 1698 "./glsl.g"
1147 sym(1).type_qualifier.layout_list = sym(1).layout_list;
1148 sym(1).type_qualifier.qualifier = sym(2).qualifier;
1151 #line 1706 "./glsl.g"
1154 sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier;
1155 sym(1).type_qualifier.layout_list = 0;
1158 #line 1714 "./glsl.g"
1161 sym(1).type_qualifier.qualifier = sym(1).qualifier;
1162 sym(1).type_qualifier.layout_list = 0;
1165 #line 1722 "./glsl.g"
1168 sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier;
1169 sym(1).type_qualifier.layout_list = 0;
1172 #line 1730 "./glsl.g"
1175 sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier | sym(3).qualifier;
1176 sym(1).type_qualifier.layout_list = 0;
1179 #line 1738 "./glsl.g"
1182 sym(1).type_qualifier.qualifier = QualifiedTypeAST::Invariant;
1183 sym(1).type_qualifier.layout_list = 0;
1186 #line 1746 "./glsl.g"
1189 sym(1).qualifier = QualifiedTypeAST::Const;
1192 #line 1753 "./glsl.g"
1195 sym(1).qualifier = QualifiedTypeAST::Attribute;
1198 #line 1760 "./glsl.g"
1201 sym(1).qualifier = QualifiedTypeAST::Varying;
1204 #line 1767 "./glsl.g"
1207 sym(1).qualifier = QualifiedTypeAST::CentroidVarying;
1210 #line 1774 "./glsl.g"
1213 sym(1).qualifier = QualifiedTypeAST::In;
1216 #line 1781 "./glsl.g"
1219 sym(1).qualifier = QualifiedTypeAST::Out;
1222 #line 1788 "./glsl.g"
1225 sym(1).qualifier = QualifiedTypeAST::CentroidIn;
1228 #line 1795 "./glsl.g"
1231 sym(1).qualifier = QualifiedTypeAST::CentroidOut;
1234 #line 1802 "./glsl.g"
1237 sym(1).qualifier = QualifiedTypeAST::PatchIn;
1240 #line 1809 "./glsl.g"
1243 sym(1).qualifier = QualifiedTypeAST::PatchOut;
1246 #line 1816 "./glsl.g"
1249 sym(1).qualifier = QualifiedTypeAST::SampleIn;
1252 #line 1823 "./glsl.g"
1255 sym(1).qualifier = QualifiedTypeAST::SampleOut;
1258 #line 1830 "./glsl.g"
1261 sym(1).qualifier = QualifiedTypeAST::Uniform;
1264 #line 1837 "./glsl.g"
1270 #line 1844 "./glsl.g"
1273 if (!type(2)->setPrecision(sym(1).precision)) {
1274 // TODO: issue an error about precision not allowed on this type.
1279 #line 1854 "./glsl.g"
1285 #line 1861 "./glsl.g"
1288 ast(1) = makeAstNode<ArrayTypeAST>(type(1));
1291 #line 1868 "./glsl.g"
1294 ast(1) = makeAstNode<ArrayTypeAST>(type(1), expression(3));
1297 #line 1875 "./glsl.g"
1300 ast(1) = makeBasicType(T_VOID);
1303 #line 1882 "./glsl.g"
1306 ast(1) = makeBasicType(T_FLOAT);
1309 #line 1889 "./glsl.g"
1312 ast(1) = makeBasicType(T_DOUBLE);
1315 #line 1896 "./glsl.g"
1318 ast(1) = makeBasicType(T_INT);
1321 #line 1903 "./glsl.g"
1324 ast(1) = makeBasicType(T_UINT);
1327 #line 1910 "./glsl.g"
1330 ast(1) = makeBasicType(T_BOOL);
1333 #line 1917 "./glsl.g"
1336 ast(1) = makeBasicType(T_VEC2);
1339 #line 1924 "./glsl.g"
1342 ast(1) = makeBasicType(T_VEC3);
1345 #line 1931 "./glsl.g"
1348 ast(1) = makeBasicType(T_VEC4);
1351 #line 1938 "./glsl.g"
1354 ast(1) = makeBasicType(T_DVEC2);
1357 #line 1945 "./glsl.g"
1360 ast(1) = makeBasicType(T_DVEC3);
1363 #line 1952 "./glsl.g"
1366 ast(1) = makeBasicType(T_DVEC4);
1369 #line 1959 "./glsl.g"
1372 ast(1) = makeBasicType(T_BVEC2);
1375 #line 1966 "./glsl.g"
1378 ast(1) = makeBasicType(T_BVEC3);
1381 #line 1973 "./glsl.g"
1384 ast(1) = makeBasicType(T_BVEC4);
1387 #line 1980 "./glsl.g"
1390 ast(1) = makeBasicType(T_IVEC2);
1393 #line 1987 "./glsl.g"
1396 ast(1) = makeBasicType(T_IVEC3);
1399 #line 1994 "./glsl.g"
1402 ast(1) = makeBasicType(T_IVEC4);
1405 #line 2001 "./glsl.g"
1408 ast(1) = makeBasicType(T_UVEC2);
1411 #line 2008 "./glsl.g"
1414 ast(1) = makeBasicType(T_UVEC3);
1417 #line 2015 "./glsl.g"
1420 ast(1) = makeBasicType(T_UVEC4);
1423 #line 2022 "./glsl.g"
1426 ast(1) = makeBasicType(T_MAT2);
1429 #line 2029 "./glsl.g"
1432 ast(1) = makeBasicType(T_MAT3);
1435 #line 2036 "./glsl.g"
1438 ast(1) = makeBasicType(T_MAT4);
1441 #line 2043 "./glsl.g"
1444 ast(1) = makeBasicType(T_MAT2);
1447 #line 2050 "./glsl.g"
1450 ast(1) = makeBasicType(T_MAT2X3);
1453 #line 2057 "./glsl.g"
1456 ast(1) = makeBasicType(T_MAT2X4);
1459 #line 2064 "./glsl.g"
1462 ast(1) = makeBasicType(T_MAT3X2);
1465 #line 2071 "./glsl.g"
1468 ast(1) = makeBasicType(T_MAT3);
1471 #line 2078 "./glsl.g"
1474 ast(1) = makeBasicType(T_MAT3X4);
1477 #line 2085 "./glsl.g"
1480 ast(1) = makeBasicType(T_MAT4X2);
1483 #line 2092 "./glsl.g"
1486 ast(1) = makeBasicType(T_MAT4X3);
1489 #line 2099 "./glsl.g"
1492 ast(1) = makeBasicType(T_MAT4);
1495 #line 2106 "./glsl.g"
1498 ast(1) = makeBasicType(T_DMAT2);
1501 #line 2113 "./glsl.g"
1504 ast(1) = makeBasicType(T_DMAT3);
1507 #line 2120 "./glsl.g"
1510 ast(1) = makeBasicType(T_DMAT4);
1513 #line 2127 "./glsl.g"
1516 ast(1) = makeBasicType(T_DMAT2);
1519 #line 2134 "./glsl.g"
1522 ast(1) = makeBasicType(T_DMAT2X3);
1525 #line 2141 "./glsl.g"
1528 ast(1) = makeBasicType(T_DMAT2X4);
1531 #line 2148 "./glsl.g"
1534 ast(1) = makeBasicType(T_DMAT3X2);
1537 #line 2155 "./glsl.g"
1540 ast(1) = makeBasicType(T_DMAT3);
1543 #line 2162 "./glsl.g"
1546 ast(1) = makeBasicType(T_DMAT3X4);
1549 #line 2169 "./glsl.g"
1552 ast(1) = makeBasicType(T_DMAT4X2);
1555 #line 2176 "./glsl.g"
1558 ast(1) = makeBasicType(T_DMAT4X3);
1561 #line 2183 "./glsl.g"
1564 ast(1) = makeBasicType(T_DMAT4);
1567 #line 2190 "./glsl.g"
1570 ast(1) = makeBasicType(T_SAMPLER1D);
1573 #line 2197 "./glsl.g"
1576 ast(1) = makeBasicType(T_SAMPLER2D);
1579 #line 2204 "./glsl.g"
1582 ast(1) = makeBasicType(T_SAMPLER3D);
1585 #line 2211 "./glsl.g"
1588 ast(1) = makeBasicType(T_SAMPLERCUBE);
1591 #line 2218 "./glsl.g"
1594 ast(1) = makeBasicType(T_SAMPLER1DSHADOW);
1597 #line 2225 "./glsl.g"
1600 ast(1) = makeBasicType(T_SAMPLER2DSHADOW);
1603 #line 2232 "./glsl.g"
1606 ast(1) = makeBasicType(T_SAMPLERCUBESHADOW);
1609 #line 2239 "./glsl.g"
1612 ast(1) = makeBasicType(T_SAMPLER1DARRAY);
1615 #line 2246 "./glsl.g"
1618 ast(1) = makeBasicType(T_SAMPLER2DARRAY);
1621 #line 2253 "./glsl.g"
1624 ast(1) = makeBasicType(T_SAMPLER1DARRAYSHADOW);
1627 #line 2260 "./glsl.g"
1630 ast(1) = makeBasicType(T_SAMPLER2DARRAYSHADOW);
1633 #line 2267 "./glsl.g"
1636 ast(1) = makeBasicType(T_SAMPLERCUBEARRAY);
1639 #line 2274 "./glsl.g"
1642 ast(1) = makeBasicType(T_SAMPLERCUBEARRAYSHADOW);
1645 #line 2281 "./glsl.g"
1648 ast(1) = makeBasicType(T_ISAMPLER1D);
1651 #line 2288 "./glsl.g"
1654 ast(1) = makeBasicType(T_ISAMPLER2D);
1657 #line 2295 "./glsl.g"
1660 ast(1) = makeBasicType(T_ISAMPLER3D);
1663 #line 2302 "./glsl.g"
1666 ast(1) = makeBasicType(T_ISAMPLERCUBE);
1669 #line 2309 "./glsl.g"
1672 ast(1) = makeBasicType(T_ISAMPLER1DARRAY);
1675 #line 2316 "./glsl.g"
1678 ast(1) = makeBasicType(T_ISAMPLER2DARRAY);
1681 #line 2323 "./glsl.g"
1684 ast(1) = makeBasicType(T_ISAMPLERCUBEARRAY);
1687 #line 2330 "./glsl.g"
1690 ast(1) = makeBasicType(T_USAMPLER1D);
1693 #line 2337 "./glsl.g"
1696 ast(1) = makeBasicType(T_USAMPLER2D);
1699 #line 2344 "./glsl.g"
1702 ast(1) = makeBasicType(T_USAMPLER3D);
1705 #line 2351 "./glsl.g"
1708 ast(1) = makeBasicType(T_USAMPLERCUBE);
1711 #line 2358 "./glsl.g"
1714 ast(1) = makeBasicType(T_USAMPLER1DARRAY);
1717 #line 2365 "./glsl.g"
1720 ast(1) = makeBasicType(T_USAMPLER2DARRAY);
1723 #line 2372 "./glsl.g"
1726 ast(1) = makeBasicType(T_USAMPLERCUBEARRAY);
1729 #line 2379 "./glsl.g"
1732 ast(1) = makeBasicType(T_SAMPLER2DRECT);
1735 #line 2386 "./glsl.g"
1738 ast(1) = makeBasicType(T_SAMPLER2DRECTSHADOW);
1741 #line 2393 "./glsl.g"
1744 ast(1) = makeBasicType(T_ISAMPLER2DRECT);
1747 #line 2400 "./glsl.g"
1750 ast(1) = makeBasicType(T_USAMPLER2DRECT);
1753 #line 2407 "./glsl.g"
1756 ast(1) = makeBasicType(T_SAMPLERBUFFER);
1759 #line 2414 "./glsl.g"
1762 ast(1) = makeBasicType(T_ISAMPLERBUFFER);
1765 #line 2421 "./glsl.g"
1768 ast(1) = makeBasicType(T_USAMPLERBUFFER);
1771 #line 2428 "./glsl.g"
1774 ast(1) = makeBasicType(T_SAMPLER2DMS);
1777 #line 2435 "./glsl.g"
1780 ast(1) = makeBasicType(T_ISAMPLER2DMS);
1783 #line 2442 "./glsl.g"
1786 ast(1) = makeBasicType(T_USAMPLER2DMS);
1789 #line 2449 "./glsl.g"
1792 ast(1) = makeBasicType(T_SAMPLER2DMSARRAY);
1795 #line 2456 "./glsl.g"
1798 ast(1) = makeBasicType(T_ISAMPLER2DMSARRAY);
1801 #line 2463 "./glsl.g"
1804 ast(1) = makeBasicType(T_USAMPLER2DMSARRAY);
1807 #line 2470 "./glsl.g"
1813 #line 2477 "./glsl.g"
1816 ast(1) = makeAstNode<NamedTypeAST>(string(1));
1819 #line 2484 "./glsl.g"
1822 sym(1).precision = TypeAST::Highp;
1825 #line 2491 "./glsl.g"
1828 sym(1).precision = TypeAST::Mediump;
1831 #line 2498 "./glsl.g"
1834 sym(1).precision = TypeAST::Lowp;
1837 #line 2505 "./glsl.g"
1840 ast(1) = makeAstNode<StructTypeAST>(string(2), sym(4).field_list);
1843 #line 2512 "./glsl.g"
1846 ast(1) = makeAstNode<StructTypeAST>(sym(3).field_list);
1849 #line 2519 "./glsl.g"
1855 #line 2526 "./glsl.g"
1858 sym(1).field_list = appendLists(sym(1).field_list, sym(2).field_list);
1861 #line 2533 "./glsl.g"
1864 sym(1).field_list = StructTypeAST::fixInnerTypes(type(1), sym(2).field_list);
1867 #line 2540 "./glsl.g"
1870 sym(1).field_list = StructTypeAST::fixInnerTypes
1871 (makeAstNode<QualifiedTypeAST>
1872 (sym(1).type_qualifier.qualifier, type(2),
1873 sym(1).type_qualifier.layout_list), sym(3).field_list);
1876 #line 2550 "./glsl.g"
1880 sym(1).field_list = makeAstNode< List<StructTypeAST::Field *> >(sym(1).field);
1883 #line 2558 "./glsl.g"
1886 sym(1).field_list = makeAstNode< List<StructTypeAST::Field *> >(sym(1).field_list, sym(3).field);
1889 #line 2565 "./glsl.g"
1892 sym(1).field = makeAstNode<StructTypeAST::Field>(string(1));
1895 #line 2572 "./glsl.g"
1898 sym(1).field = makeAstNode<StructTypeAST::Field>
1899 (string(1), makeAstNode<ArrayTypeAST>((TypeAST *)0));
1902 #line 2580 "./glsl.g"
1905 sym(1).field = makeAstNode<StructTypeAST::Field>
1906 (string(1), makeAstNode<ArrayTypeAST>((TypeAST *)0, expression(3)));
1909 #line 2588 "./glsl.g"
1915 #line 2595 "./glsl.g"
1918 ast(1) = makeAstNode<DeclarationStatementAST>(sym(1).declaration);
1921 #line 2602 "./glsl.g"
1927 #line 2609 "./glsl.g"
1933 #line 2616 "./glsl.g"
1939 #line 2623 "./glsl.g"
1945 #line 2630 "./glsl.g"
1951 #line 2637 "./glsl.g"
1957 #line 2644 "./glsl.g"
1963 #line 2651 "./glsl.g"
1969 #line 2658 "./glsl.g"
1975 #line 2665 "./glsl.g"
1978 CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>();
1979 stmt->start = tokenAt(location(1)).begin();
1980 stmt->end = tokenAt(location(2)).end();
1984 #line 2675 "./glsl.g"
1987 CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>(sym(2).statement_list);
1988 stmt->start = tokenAt(location(1)).begin();
1989 stmt->end = tokenAt(location(3)).end();
1993 #line 2685 "./glsl.g"
1999 #line 2692 "./glsl.g"
2005 #line 2699 "./glsl.g"
2008 CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>();
2009 stmt->start = tokenAt(location(1)).begin();
2010 stmt->end = tokenAt(location(2)).end();
2014 #line 2709 "./glsl.g"
2017 CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>(sym(2).statement_list);
2018 stmt->start = tokenAt(location(1)).begin();
2019 stmt->end = tokenAt(location(3)).end();
2023 #line 2719 "./glsl.g"
2026 sym(1).statement_list = makeAstNode< List<StatementAST *> >(sym(1).statement);
2029 #line 2726 "./glsl.g"
2032 sym(1).statement_list = makeAstNode< List<StatementAST *> >(sym(1).statement_list, sym(2).statement);
2035 #line 2733 "./glsl.g"
2038 ast(1) = makeAstNode<CompoundStatementAST>(); // Empty statement
2041 #line 2740 "./glsl.g"
2044 ast(1) = makeAstNode<ExpressionStatementAST>(expression(1));
2047 #line 2747 "./glsl.g"
2050 ast(1) = makeAstNode<IfStatementAST>(expression(3), sym(5).ifstmt.thenClause, sym(5).ifstmt.elseClause);
2053 #line 2754 "./glsl.g"
2056 sym(1).ifstmt.thenClause = statement(1);
2057 sym(1).ifstmt.elseClause = statement(3);
2060 #line 2762 "./glsl.g"
2063 sym(1).ifstmt.thenClause = statement(1);
2064 sym(1).ifstmt.elseClause = 0;
2067 #line 2770 "./glsl.g"
2073 #line 2777 "./glsl.g"
2076 ast(1) = makeAstNode<DeclarationExpressionAST>
2077 (type(1), string(2), expression(4));
2080 #line 2785 "./glsl.g"
2083 ast(1) = makeAstNode<SwitchStatementAST>(expression(3), statement(6));
2086 #line 2792 "./glsl.g"
2089 ast(1) = makeAstNode<CompoundStatementAST>();
2092 #line 2799 "./glsl.g"
2095 ast(1) = makeAstNode<CompoundStatementAST>(sym(1).statement_list);
2098 #line 2806 "./glsl.g"
2101 ast(1) = makeAstNode<CaseLabelStatementAST>(expression(2));
2104 #line 2813 "./glsl.g"
2107 ast(1) = makeAstNode<CaseLabelStatementAST>();
2110 #line 2820 "./glsl.g"
2113 ast(1) = makeAstNode<WhileStatementAST>(expression(3), statement(5));
2116 #line 2827 "./glsl.g"
2119 ast(1) = makeAstNode<DoStatementAST>(statement(2), expression(5));
2122 #line 2834 "./glsl.g"
2125 ast(1) = makeAstNode<ForStatementAST>(statement(3), sym(4).forstmt.condition, sym(4).forstmt.increment, statement(6));
2128 #line 2841 "./glsl.g"
2134 #line 2848 "./glsl.g"
2140 #line 2855 "./glsl.g"
2146 #line 2862 "./glsl.g"
2152 #line 2869 "./glsl.g"
2155 sym(1).forstmt.condition = expression(1);
2156 sym(1).forstmt.increment = 0;
2159 #line 2877 "./glsl.g"
2162 sym(1).forstmt.condition = expression(1);
2163 sym(1).forstmt.increment = expression(3);
2166 #line 2885 "./glsl.g"
2169 ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Continue);
2172 #line 2892 "./glsl.g"
2175 ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Break);
2178 #line 2899 "./glsl.g"
2181 ast(1) = makeAstNode<ReturnStatementAST>();
2184 #line 2906 "./glsl.g"
2187 ast(1) = makeAstNode<ReturnStatementAST>(expression(2));
2190 #line 2913 "./glsl.g"
2193 ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Discard);
2196 #line 2920 "./glsl.g"
2199 ast(1) = makeAstNode<TranslationUnitAST>(sym(1).declaration_list);
2202 #line 2927 "./glsl.g"
2205 if (sym(1).declaration) {
2206 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
2207 (sym(1).declaration);
2209 sym(1).declaration_list = 0;
2213 #line 2939 "./glsl.g"
2216 if (sym(1).declaration_list && sym(2).declaration) {
2217 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
2218 (sym(1).declaration_list, sym(2).declaration);
2219 } else if (!sym(1).declaration_list) {
2220 if (sym(2).declaration) {
2221 sym(1).declaration_list = makeAstNode< List<DeclarationAST *> >
2222 (sym(2).declaration);
2224 sym(1).declaration_list = 0;
2229 #line 2956 "./glsl.g"
2235 #line 2963 "./glsl.g"
2241 #line 2970 "./glsl.g"
2247 #line 2977 "./glsl.g"
2250 function(1)->body = statement(2);
2253 #line 2984 "./glsl.g"
2259 #line 2992 "./glsl.g"
2265 #line 2999 "./glsl.g"
2271 #line 3005 "./glsl.g"
2274 } // end Parser::reduce()