diff --git a/src/libs/glsl/glsl.g b/src/libs/glsl/glsl.g
index d851c25037c99983ec6eb78de5538386a3f60c4d..9472eb4a10e66b327c589b55c0fff14447964120 100644
--- a/src/libs/glsl/glsl.g
+++ b/src/libs/glsl/glsl.g
@@ -242,6 +242,7 @@
 #include "$header"
 #include "glsllexer.h"
 #include "glslast.h"
+#include "glslengine.h"
 #include <vector>
 #include <stack>
 
@@ -279,10 +280,51 @@ private:
     inline int tokenKind(int index) const { return _tokens.at(index).kind; }
     void reduce(int ruleno);
 
+    template <typename T>
+    T *makeAstNode()
+    {
+        T *node = new (_engine->pool()) T ();
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
+    template <typename T, typename A1>
+    T *makeAstNode(A1 a1)
+    {
+        T *node = new (_engine->pool()) T (a1);
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
+    template <typename T, typename A1, typename A2>
+    T *makeAstNode(A1 a1, A2 a2)
+    {
+        T *node = new (_engine->pool()) T (a1, a2);
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
+    template <typename T, typename A1, typename A2, typename A3>
+    T *makeAstNode(A1 a1, A2 a2, A3 a3)
+    {
+        T *node = new (_engine->pool()) T (a1, a2, a3);
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
+    template <typename T, typename A1, typename A2, typename A3, typename A4>
+    T *makeAstNode(A1 a1, A2 a2, A3 a3, A4 a4)
+    {
+        T *node = new (_engine->pool()) T (a1, a2, a3, a4);
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
 private:
     Engine *_engine;
     int _tos;
     int _index;
+    int yyloc;
     std::vector<int> _stateStack;
     std::vector<int> _locationStack;
     std::vector<Value> _symStack;
@@ -331,7 +373,7 @@ private:
 using namespace GLSL;
 
 Parser::Parser(Engine *engine, const char *source, unsigned size, int variant)
-    : _engine(engine), _tos(-1), _index(0)
+    : _engine(engine), _tos(-1), _index(0), yyloc(-1)
 {
     _tokens.reserve(1024);
 
@@ -398,7 +440,7 @@ TranslationUnit *Parser::parse()
 {
     int action = 0;
     int yytoken = -1;
-    int yyloc = -1;
+    yyloc = -1;
     void *yyval = 0; // value of the current token.
 
     _tos = -1;
@@ -465,7 +507,7 @@ switch(ruleno) {
 variable_identifier ::= IDENTIFIER ;
 /.
 case $rule_number: {
-    ast(1) = new (_engine->pool()) IdentifierExpression(sym(1).string);
+    ast(1) = makeAstNode<IdentifierExpression>(sym(1).string);
 }   break;
 ./
 
@@ -703,7 +745,7 @@ case $rule_number: {
 multiplicative_expression ::= multiplicative_expression STAR unary_expression ;
 /.
 case $rule_number: {
-    ast(1) = new (_engine->pool()) BinaryExpression(AST::Kind_Multiply, sym(1).expression, sym(3).expression);
+    ast(1) = makeAstNode<BinaryExpression>(AST::Kind_Multiply, sym(1).expression, sym(3).expression);
 }   break;
 ./
 
@@ -2600,21 +2642,21 @@ case $rule_number: {
 translation_unit ::= external_declaration_list ;
 /.
 case $rule_number: {
-    ast(1) = new (_engine->pool()) TranslationUnit(sym(1).declaration_list);
+    ast(1) = makeAstNode<TranslationUnit>(sym(1).declaration_list);
 }   break;
 ./
 
 external_declaration_list ::= external_declaration ;
 /.
 case $rule_number: {
-    sym(1).declaration_list = new (_engine->pool()) List<Declaration *>(sym(1).declaration);
+    sym(1).declaration_list = makeAstNode< List<Declaration *> >(sym(1).declaration);
 }   break;
 ./
 
 external_declaration_list ::= external_declaration_list external_declaration ;
 /.
 case $rule_number: {
-    sym(1).declaration_list = new (_engine->pool())  List<Declaration *>(sym(1).declaration_list, sym(2).declaration);
+    sym(1).declaration_list = makeAstNode< List<Declaration *> >(sym(1).declaration_list, sym(2).declaration);
 }   break;
 ./
 
diff --git a/src/libs/glsl/glslast.h b/src/libs/glsl/glslast.h
index 7be3cae9a6150e00f6f44880dd103c41dfc8d3c2..3fc5a961578f657529679fbaed215639702b36f0 100644
--- a/src/libs/glsl/glslast.h
+++ b/src/libs/glsl/glslast.h
@@ -70,10 +70,10 @@ class GLSL_EXPORT List: public Managed
 {
 public:
     List(const T &value)
-        : value(value), next(this) {}
+        : value(value), next(this), lineno(0) {}
 
     List(List *previous, const T &value)
-        : value(value)
+        : value(value), lineno(0)
     {
         next = previous->next;
         previous->next = this;
@@ -88,6 +88,7 @@ public:
 
     T value;
     List *next;
+    int lineno;
 };
 
 // Append two lists, which are assumed to still be circular, pre-finish.
diff --git a/src/libs/glsl/glslparser.cpp b/src/libs/glsl/glslparser.cpp
index 6f128b43a63189dfb2057af48e99431bc9f4e5fd..e4da61befb395f08eb27b1c8430489c31a71aac4 100644
--- a/src/libs/glsl/glslparser.cpp
+++ b/src/libs/glsl/glslparser.cpp
@@ -1,5 +1,5 @@
 
-#line 295 "./glsl.g"
+#line 337 "./glsl.g"
 
 /**************************************************************************
 **
@@ -39,7 +39,7 @@
 using namespace GLSL;
 
 Parser::Parser(Engine *engine, const char *source, unsigned size, int variant)
-    : _engine(engine), _tos(-1), _index(0)
+    : _engine(engine), _tos(-1), _index(0), yyloc(-1)
 {
     _tokens.reserve(1024);
 
@@ -106,7 +106,7 @@ TranslationUnit *Parser::parse()
 {
     int action = 0;
     int yytoken = -1;
-    int yyloc = -1;
+    yyloc = -1;
     void *yyval = 0; // value of the current token.
 
     _tos = -1;
@@ -159,1891 +159,1891 @@ TranslationUnit *Parser::parse()
     return 0;
 }
 
-#line 457 "./glsl.g"
+#line 499 "./glsl.g"
 
 void Parser::reduce(int ruleno)
 {
 switch(ruleno) {
 
-#line 466 "./glsl.g"
+#line 508 "./glsl.g"
 
 case 0: {
-    ast(1) = new (_engine->pool()) IdentifierExpression(sym(1).string);
+    ast(1) = makeAstNode<IdentifierExpression>(sym(1).string);
 }   break;
 
-#line 473 "./glsl.g"
+#line 515 "./glsl.g"
 
 case 1: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 480 "./glsl.g"
+#line 522 "./glsl.g"
 
 case 2: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 487 "./glsl.g"
+#line 529 "./glsl.g"
 
 case 3: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 494 "./glsl.g"
+#line 536 "./glsl.g"
 
 case 4: {
     // nothing to do.
 }   break;
 
-#line 501 "./glsl.g"
+#line 543 "./glsl.g"
 
 case 5: {
     ast(1) = ast(2);
 }   break;
 
-#line 508 "./glsl.g"
+#line 550 "./glsl.g"
 
 case 6: {
     // nothing to do.
 }   break;
 
-#line 515 "./glsl.g"
+#line 557 "./glsl.g"
 
 case 7: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 522 "./glsl.g"
+#line 564 "./glsl.g"
 
 case 8: {
     // nothing to do.
 }   break;
 
-#line 529 "./glsl.g"
+#line 571 "./glsl.g"
 
 case 9: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 536 "./glsl.g"
+#line 578 "./glsl.g"
 
 case 10: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 543 "./glsl.g"
+#line 585 "./glsl.g"
 
 case 11: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 550 "./glsl.g"
+#line 592 "./glsl.g"
 
 case 12: {
     // nothing to do.
 }   break;
 
-#line 557 "./glsl.g"
+#line 599 "./glsl.g"
 
 case 13: {
     // nothing to do.
 }   break;
 
-#line 564 "./glsl.g"
+#line 606 "./glsl.g"
 
 case 14: {
     // nothing to do.
 }   break;
 
-#line 571 "./glsl.g"
+#line 613 "./glsl.g"
 
 case 15: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 578 "./glsl.g"
+#line 620 "./glsl.g"
 
 case 16: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 585 "./glsl.g"
+#line 627 "./glsl.g"
 
 case 17: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 592 "./glsl.g"
+#line 634 "./glsl.g"
 
 case 18: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 599 "./glsl.g"
+#line 641 "./glsl.g"
 
 case 19: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 606 "./glsl.g"
+#line 648 "./glsl.g"
 
 case 20: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 613 "./glsl.g"
+#line 655 "./glsl.g"
 
 case 21: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 620 "./glsl.g"
+#line 662 "./glsl.g"
 
 case 22: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 627 "./glsl.g"
+#line 669 "./glsl.g"
 
 case 23: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 634 "./glsl.g"
+#line 676 "./glsl.g"
 
 case 24: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 641 "./glsl.g"
+#line 683 "./glsl.g"
 
 case 25: {
     // nothing to do.
 }   break;
 
-#line 648 "./glsl.g"
+#line 690 "./glsl.g"
 
 case 26: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 655 "./glsl.g"
+#line 697 "./glsl.g"
 
 case 27: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 662 "./glsl.g"
+#line 704 "./glsl.g"
 
 case 28: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 669 "./glsl.g"
+#line 711 "./glsl.g"
 
 case 29: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 676 "./glsl.g"
+#line 718 "./glsl.g"
 
 case 30: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 683 "./glsl.g"
+#line 725 "./glsl.g"
 
 case 31: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 690 "./glsl.g"
+#line 732 "./glsl.g"
 
 case 32: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 697 "./glsl.g"
+#line 739 "./glsl.g"
 
 case 33: {
     // nothing to do.
 }   break;
 
-#line 704 "./glsl.g"
+#line 746 "./glsl.g"
 
 case 34: {
-    ast(1) = new (_engine->pool()) BinaryExpression(AST::Kind_Multiply, sym(1).expression, sym(3).expression);
+    ast(1) = makeAstNode<BinaryExpression>(AST::Kind_Multiply, sym(1).expression, sym(3).expression);
 }   break;
 
-#line 711 "./glsl.g"
+#line 753 "./glsl.g"
 
 case 35: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 718 "./glsl.g"
+#line 760 "./glsl.g"
 
 case 36: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 725 "./glsl.g"
+#line 767 "./glsl.g"
 
 case 37: {
     // nothing to do.
 }   break;
 
-#line 732 "./glsl.g"
+#line 774 "./glsl.g"
 
 case 38: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 739 "./glsl.g"
+#line 781 "./glsl.g"
 
 case 39: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 746 "./glsl.g"
+#line 788 "./glsl.g"
 
 case 40: {
     // nothing to do.
 }   break;
 
-#line 753 "./glsl.g"
+#line 795 "./glsl.g"
 
 case 41: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 760 "./glsl.g"
+#line 802 "./glsl.g"
 
 case 42: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 767 "./glsl.g"
+#line 809 "./glsl.g"
 
 case 43: {
     // nothing to do.
 }   break;
 
-#line 774 "./glsl.g"
+#line 816 "./glsl.g"
 
 case 44: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 781 "./glsl.g"
+#line 823 "./glsl.g"
 
 case 45: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 788 "./glsl.g"
+#line 830 "./glsl.g"
 
 case 46: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 795 "./glsl.g"
+#line 837 "./glsl.g"
 
 case 47: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 802 "./glsl.g"
+#line 844 "./glsl.g"
 
 case 48: {
     // nothing to do.
 }   break;
 
-#line 809 "./glsl.g"
+#line 851 "./glsl.g"
 
 case 49: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 816 "./glsl.g"
+#line 858 "./glsl.g"
 
 case 50: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 823 "./glsl.g"
+#line 865 "./glsl.g"
 
 case 51: {
     // nothing to do.
 }   break;
 
-#line 830 "./glsl.g"
+#line 872 "./glsl.g"
 
 case 52: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 837 "./glsl.g"
+#line 879 "./glsl.g"
 
 case 53: {
     // nothing to do.
 }   break;
 
-#line 844 "./glsl.g"
+#line 886 "./glsl.g"
 
 case 54: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 851 "./glsl.g"
+#line 893 "./glsl.g"
 
 case 55: {
     // nothing to do.
 }   break;
 
-#line 858 "./glsl.g"
+#line 900 "./glsl.g"
 
 case 56: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 865 "./glsl.g"
+#line 907 "./glsl.g"
 
 case 57: {
     // nothing to do.
 }   break;
 
-#line 872 "./glsl.g"
+#line 914 "./glsl.g"
 
 case 58: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 879 "./glsl.g"
+#line 921 "./glsl.g"
 
 case 59: {
     // nothing to do.
 }   break;
 
-#line 886 "./glsl.g"
+#line 928 "./glsl.g"
 
 case 60: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 893 "./glsl.g"
+#line 935 "./glsl.g"
 
 case 61: {
     // nothing to do.
 }   break;
 
-#line 900 "./glsl.g"
+#line 942 "./glsl.g"
 
 case 62: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 907 "./glsl.g"
+#line 949 "./glsl.g"
 
 case 63: {
     // nothing to do.
 }   break;
 
-#line 914 "./glsl.g"
+#line 956 "./glsl.g"
 
 case 64: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 921 "./glsl.g"
+#line 963 "./glsl.g"
 
 case 65: {
     // nothing to do.
 }   break;
 
-#line 928 "./glsl.g"
+#line 970 "./glsl.g"
 
 case 66: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 935 "./glsl.g"
+#line 977 "./glsl.g"
 
 case 67: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 942 "./glsl.g"
+#line 984 "./glsl.g"
 
 case 68: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 949 "./glsl.g"
+#line 991 "./glsl.g"
 
 case 69: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 956 "./glsl.g"
+#line 998 "./glsl.g"
 
 case 70: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 963 "./glsl.g"
+#line 1005 "./glsl.g"
 
 case 71: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 970 "./glsl.g"
+#line 1012 "./glsl.g"
 
 case 72: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 977 "./glsl.g"
+#line 1019 "./glsl.g"
 
 case 73: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 984 "./glsl.g"
+#line 1026 "./glsl.g"
 
 case 74: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 991 "./glsl.g"
+#line 1033 "./glsl.g"
 
 case 75: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 998 "./glsl.g"
+#line 1040 "./glsl.g"
 
 case 76: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1005 "./glsl.g"
+#line 1047 "./glsl.g"
 
 case 77: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1012 "./glsl.g"
+#line 1054 "./glsl.g"
 
 case 78: {
     // nothing to do.
 }   break;
 
-#line 1019 "./glsl.g"
+#line 1061 "./glsl.g"
 
 case 79: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1026 "./glsl.g"
+#line 1068 "./glsl.g"
 
 case 80: {
     // nothing to do.
 }   break;
 
-#line 1033 "./glsl.g"
+#line 1075 "./glsl.g"
 
 case 81: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1040 "./glsl.g"
+#line 1082 "./glsl.g"
 
 case 82: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1047 "./glsl.g"
+#line 1089 "./glsl.g"
 
 case 83: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1054 "./glsl.g"
+#line 1096 "./glsl.g"
 
 case 84: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1061 "./glsl.g"
+#line 1103 "./glsl.g"
 
 case 85: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1068 "./glsl.g"
+#line 1110 "./glsl.g"
 
 case 86: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1075 "./glsl.g"
+#line 1117 "./glsl.g"
 
 case 87: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1082 "./glsl.g"
+#line 1124 "./glsl.g"
 
 case 88: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1089 "./glsl.g"
+#line 1131 "./glsl.g"
 
 case 89: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1096 "./glsl.g"
+#line 1138 "./glsl.g"
 
 case 90: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1103 "./glsl.g"
+#line 1145 "./glsl.g"
 
 case 91: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1110 "./glsl.g"
+#line 1152 "./glsl.g"
 
 case 92: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1117 "./glsl.g"
+#line 1159 "./glsl.g"
 
 case 93: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1124 "./glsl.g"
+#line 1166 "./glsl.g"
 
 case 94: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1131 "./glsl.g"
+#line 1173 "./glsl.g"
 
 case 95: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1138 "./glsl.g"
+#line 1180 "./glsl.g"
 
 case 96: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1145 "./glsl.g"
+#line 1187 "./glsl.g"
 
 case 97: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1152 "./glsl.g"
+#line 1194 "./glsl.g"
 
 case 98: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1159 "./glsl.g"
+#line 1201 "./glsl.g"
 
 case 99: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1166 "./glsl.g"
+#line 1208 "./glsl.g"
 
 case 100: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1173 "./glsl.g"
+#line 1215 "./glsl.g"
 
 case 101: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1180 "./glsl.g"
+#line 1222 "./glsl.g"
 
 case 102: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1187 "./glsl.g"
+#line 1229 "./glsl.g"
 
 case 103: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1194 "./glsl.g"
+#line 1236 "./glsl.g"
 
 case 104: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1201 "./glsl.g"
+#line 1243 "./glsl.g"
 
 case 105: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1208 "./glsl.g"
+#line 1250 "./glsl.g"
 
 case 106: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1215 "./glsl.g"
+#line 1257 "./glsl.g"
 
 case 107: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1222 "./glsl.g"
+#line 1264 "./glsl.g"
 
 case 108: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1229 "./glsl.g"
+#line 1271 "./glsl.g"
 
 case 109: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1236 "./glsl.g"
+#line 1278 "./glsl.g"
 
 case 110: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1243 "./glsl.g"
+#line 1285 "./glsl.g"
 
 case 111: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1250 "./glsl.g"
+#line 1292 "./glsl.g"
 
 case 112: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1257 "./glsl.g"
+#line 1299 "./glsl.g"
 
 case 113: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1264 "./glsl.g"
+#line 1306 "./glsl.g"
 
 case 114: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1271 "./glsl.g"
+#line 1313 "./glsl.g"
 
 case 115: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1278 "./glsl.g"
+#line 1320 "./glsl.g"
 
 case 116: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1285 "./glsl.g"
+#line 1327 "./glsl.g"
 
 case 117: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1292 "./glsl.g"
+#line 1334 "./glsl.g"
 
 case 118: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1299 "./glsl.g"
+#line 1341 "./glsl.g"
 
 case 119: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1306 "./glsl.g"
+#line 1348 "./glsl.g"
 
 case 120: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1313 "./glsl.g"
+#line 1355 "./glsl.g"
 
 case 121: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1320 "./glsl.g"
+#line 1362 "./glsl.g"
 
 case 122: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1327 "./glsl.g"
+#line 1369 "./glsl.g"
 
 case 123: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1334 "./glsl.g"
+#line 1376 "./glsl.g"
 
 case 124: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1341 "./glsl.g"
+#line 1383 "./glsl.g"
 
 case 125: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1348 "./glsl.g"
+#line 1390 "./glsl.g"
 
 case 126: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1355 "./glsl.g"
+#line 1397 "./glsl.g"
 
 case 127: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1362 "./glsl.g"
+#line 1404 "./glsl.g"
 
 case 128: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1369 "./glsl.g"
+#line 1411 "./glsl.g"
 
 case 129: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1376 "./glsl.g"
+#line 1418 "./glsl.g"
 
 case 130: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1383 "./glsl.g"
+#line 1425 "./glsl.g"
 
 case 131: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1390 "./glsl.g"
+#line 1432 "./glsl.g"
 
 case 132: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1397 "./glsl.g"
+#line 1439 "./glsl.g"
 
 case 133: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1404 "./glsl.g"
+#line 1446 "./glsl.g"
 
 case 134: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1411 "./glsl.g"
+#line 1453 "./glsl.g"
 
 case 135: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1418 "./glsl.g"
+#line 1460 "./glsl.g"
 
 case 136: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1425 "./glsl.g"
+#line 1467 "./glsl.g"
 
 case 137: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1432 "./glsl.g"
+#line 1474 "./glsl.g"
 
 case 138: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1439 "./glsl.g"
+#line 1481 "./glsl.g"
 
 case 139: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1446 "./glsl.g"
+#line 1488 "./glsl.g"
 
 case 140: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1453 "./glsl.g"
+#line 1495 "./glsl.g"
 
 case 141: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1460 "./glsl.g"
+#line 1502 "./glsl.g"
 
 case 142: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1467 "./glsl.g"
+#line 1509 "./glsl.g"
 
 case 143: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1474 "./glsl.g"
+#line 1516 "./glsl.g"
 
 case 144: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1481 "./glsl.g"
+#line 1523 "./glsl.g"
 
 case 145: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1488 "./glsl.g"
+#line 1530 "./glsl.g"
 
 case 146: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1495 "./glsl.g"
+#line 1537 "./glsl.g"
 
 case 147: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1502 "./glsl.g"
+#line 1544 "./glsl.g"
 
 case 148: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1509 "./glsl.g"
+#line 1551 "./glsl.g"
 
 case 149: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1516 "./glsl.g"
+#line 1558 "./glsl.g"
 
 case 150: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1523 "./glsl.g"
+#line 1565 "./glsl.g"
 
 case 151: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1530 "./glsl.g"
+#line 1572 "./glsl.g"
 
 case 152: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1537 "./glsl.g"
+#line 1579 "./glsl.g"
 
 case 153: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1544 "./glsl.g"
+#line 1586 "./glsl.g"
 
 case 154: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1551 "./glsl.g"
+#line 1593 "./glsl.g"
 
 case 155: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1558 "./glsl.g"
+#line 1600 "./glsl.g"
 
 case 156: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1565 "./glsl.g"
+#line 1607 "./glsl.g"
 
 case 157: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1572 "./glsl.g"
+#line 1614 "./glsl.g"
 
 case 158: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1579 "./glsl.g"
+#line 1621 "./glsl.g"
 
 case 159: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1586 "./glsl.g"
+#line 1628 "./glsl.g"
 
 case 160: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1593 "./glsl.g"
+#line 1635 "./glsl.g"
 
 case 161: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1600 "./glsl.g"
+#line 1642 "./glsl.g"
 
 case 162: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1607 "./glsl.g"
+#line 1649 "./glsl.g"
 
 case 163: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1614 "./glsl.g"
+#line 1656 "./glsl.g"
 
 case 164: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1621 "./glsl.g"
+#line 1663 "./glsl.g"
 
 case 165: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1628 "./glsl.g"
+#line 1670 "./glsl.g"
 
 case 166: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1635 "./glsl.g"
+#line 1677 "./glsl.g"
 
 case 167: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1642 "./glsl.g"
+#line 1684 "./glsl.g"
 
 case 168: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1649 "./glsl.g"
+#line 1691 "./glsl.g"
 
 case 169: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1656 "./glsl.g"
+#line 1698 "./glsl.g"
 
 case 170: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1663 "./glsl.g"
+#line 1705 "./glsl.g"
 
 case 171: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1670 "./glsl.g"
+#line 1712 "./glsl.g"
 
 case 172: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1677 "./glsl.g"
+#line 1719 "./glsl.g"
 
 case 173: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1684 "./glsl.g"
+#line 1726 "./glsl.g"
 
 case 174: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1691 "./glsl.g"
+#line 1733 "./glsl.g"
 
 case 175: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1698 "./glsl.g"
+#line 1740 "./glsl.g"
 
 case 176: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1705 "./glsl.g"
+#line 1747 "./glsl.g"
 
 case 177: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1712 "./glsl.g"
+#line 1754 "./glsl.g"
 
 case 178: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1719 "./glsl.g"
+#line 1761 "./glsl.g"
 
 case 179: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1726 "./glsl.g"
+#line 1768 "./glsl.g"
 
 case 180: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1733 "./glsl.g"
+#line 1775 "./glsl.g"
 
 case 181: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1740 "./glsl.g"
+#line 1782 "./glsl.g"
 
 case 182: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1747 "./glsl.g"
+#line 1789 "./glsl.g"
 
 case 183: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1754 "./glsl.g"
+#line 1796 "./glsl.g"
 
 case 184: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1761 "./glsl.g"
+#line 1803 "./glsl.g"
 
 case 185: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1768 "./glsl.g"
+#line 1810 "./glsl.g"
 
 case 186: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1775 "./glsl.g"
+#line 1817 "./glsl.g"
 
 case 187: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1782 "./glsl.g"
+#line 1824 "./glsl.g"
 
 case 188: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1789 "./glsl.g"
+#line 1831 "./glsl.g"
 
 case 189: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1796 "./glsl.g"
+#line 1838 "./glsl.g"
 
 case 190: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1803 "./glsl.g"
+#line 1845 "./glsl.g"
 
 case 191: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1810 "./glsl.g"
+#line 1852 "./glsl.g"
 
 case 192: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1817 "./glsl.g"
+#line 1859 "./glsl.g"
 
 case 193: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1824 "./glsl.g"
+#line 1866 "./glsl.g"
 
 case 194: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1831 "./glsl.g"
+#line 1873 "./glsl.g"
 
 case 195: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1838 "./glsl.g"
+#line 1880 "./glsl.g"
 
 case 196: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1845 "./glsl.g"
+#line 1887 "./glsl.g"
 
 case 197: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1852 "./glsl.g"
+#line 1894 "./glsl.g"
 
 case 198: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1859 "./glsl.g"
+#line 1901 "./glsl.g"
 
 case 199: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1866 "./glsl.g"
+#line 1908 "./glsl.g"
 
 case 200: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1873 "./glsl.g"
+#line 1915 "./glsl.g"
 
 case 201: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1880 "./glsl.g"
+#line 1922 "./glsl.g"
 
 case 202: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1887 "./glsl.g"
+#line 1929 "./glsl.g"
 
 case 203: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1894 "./glsl.g"
+#line 1936 "./glsl.g"
 
 case 204: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1901 "./glsl.g"
+#line 1943 "./glsl.g"
 
 case 205: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1908 "./glsl.g"
+#line 1950 "./glsl.g"
 
 case 206: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1915 "./glsl.g"
+#line 1957 "./glsl.g"
 
 case 207: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1922 "./glsl.g"
+#line 1964 "./glsl.g"
 
 case 208: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1929 "./glsl.g"
+#line 1971 "./glsl.g"
 
 case 209: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1936 "./glsl.g"
+#line 1978 "./glsl.g"
 
 case 210: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1943 "./glsl.g"
+#line 1985 "./glsl.g"
 
 case 211: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1950 "./glsl.g"
+#line 1992 "./glsl.g"
 
 case 212: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1957 "./glsl.g"
+#line 1999 "./glsl.g"
 
 case 213: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1964 "./glsl.g"
+#line 2006 "./glsl.g"
 
 case 214: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1971 "./glsl.g"
+#line 2013 "./glsl.g"
 
 case 215: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1978 "./glsl.g"
+#line 2020 "./glsl.g"
 
 case 216: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1985 "./glsl.g"
+#line 2027 "./glsl.g"
 
 case 217: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1992 "./glsl.g"
+#line 2034 "./glsl.g"
 
 case 218: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 1999 "./glsl.g"
+#line 2041 "./glsl.g"
 
 case 219: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2006 "./glsl.g"
+#line 2048 "./glsl.g"
 
 case 220: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2013 "./glsl.g"
+#line 2055 "./glsl.g"
 
 case 221: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2020 "./glsl.g"
+#line 2062 "./glsl.g"
 
 case 222: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2027 "./glsl.g"
+#line 2069 "./glsl.g"
 
 case 223: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2034 "./glsl.g"
+#line 2076 "./glsl.g"
 
 case 224: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2041 "./glsl.g"
+#line 2083 "./glsl.g"
 
 case 225: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2048 "./glsl.g"
+#line 2090 "./glsl.g"
 
 case 226: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2055 "./glsl.g"
+#line 2097 "./glsl.g"
 
 case 227: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2062 "./glsl.g"
+#line 2104 "./glsl.g"
 
 case 228: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2069 "./glsl.g"
+#line 2111 "./glsl.g"
 
 case 229: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2076 "./glsl.g"
+#line 2118 "./glsl.g"
 
 case 230: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2083 "./glsl.g"
+#line 2125 "./glsl.g"
 
 case 231: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2090 "./glsl.g"
+#line 2132 "./glsl.g"
 
 case 232: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2097 "./glsl.g"
+#line 2139 "./glsl.g"
 
 case 233: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2104 "./glsl.g"
+#line 2146 "./glsl.g"
 
 case 234: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2111 "./glsl.g"
+#line 2153 "./glsl.g"
 
 case 235: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2118 "./glsl.g"
+#line 2160 "./glsl.g"
 
 case 236: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2125 "./glsl.g"
+#line 2167 "./glsl.g"
 
 case 237: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2132 "./glsl.g"
+#line 2174 "./glsl.g"
 
 case 238: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2139 "./glsl.g"
+#line 2181 "./glsl.g"
 
 case 239: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2146 "./glsl.g"
+#line 2188 "./glsl.g"
 
 case 240: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2153 "./glsl.g"
+#line 2195 "./glsl.g"
 
 case 241: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2160 "./glsl.g"
+#line 2202 "./glsl.g"
 
 case 242: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2167 "./glsl.g"
+#line 2209 "./glsl.g"
 
 case 243: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2174 "./glsl.g"
+#line 2216 "./glsl.g"
 
 case 244: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2181 "./glsl.g"
+#line 2223 "./glsl.g"
 
 case 245: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2188 "./glsl.g"
+#line 2230 "./glsl.g"
 
 case 246: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2195 "./glsl.g"
+#line 2237 "./glsl.g"
 
 case 247: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2202 "./glsl.g"
+#line 2244 "./glsl.g"
 
 case 248: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2209 "./glsl.g"
+#line 2251 "./glsl.g"
 
 case 249: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2216 "./glsl.g"
+#line 2258 "./glsl.g"
 
 case 250: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2223 "./glsl.g"
+#line 2265 "./glsl.g"
 
 case 251: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2230 "./glsl.g"
+#line 2272 "./glsl.g"
 
 case 252: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2237 "./glsl.g"
+#line 2279 "./glsl.g"
 
 case 253: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2244 "./glsl.g"
+#line 2286 "./glsl.g"
 
 case 254: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2251 "./glsl.g"
+#line 2293 "./glsl.g"
 
 case 255: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2258 "./glsl.g"
+#line 2300 "./glsl.g"
 
 case 256: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2265 "./glsl.g"
+#line 2307 "./glsl.g"
 
 case 257: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2272 "./glsl.g"
+#line 2314 "./glsl.g"
 
 case 258: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2279 "./glsl.g"
+#line 2321 "./glsl.g"
 
 case 259: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2286 "./glsl.g"
+#line 2328 "./glsl.g"
 
 case 260: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2293 "./glsl.g"
+#line 2335 "./glsl.g"
 
 case 261: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2300 "./glsl.g"
+#line 2342 "./glsl.g"
 
 case 262: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2307 "./glsl.g"
+#line 2349 "./glsl.g"
 
 case 263: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2314 "./glsl.g"
+#line 2356 "./glsl.g"
 
 case 264: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2321 "./glsl.g"
+#line 2363 "./glsl.g"
 
 case 265: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2328 "./glsl.g"
+#line 2370 "./glsl.g"
 
 case 266: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2335 "./glsl.g"
+#line 2377 "./glsl.g"
 
 case 267: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2342 "./glsl.g"
+#line 2384 "./glsl.g"
 
 case 268: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2349 "./glsl.g"
+#line 2391 "./glsl.g"
 
 case 269: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2356 "./glsl.g"
+#line 2398 "./glsl.g"
 
 case 270: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2363 "./glsl.g"
+#line 2405 "./glsl.g"
 
 case 271: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2370 "./glsl.g"
+#line 2412 "./glsl.g"
 
 case 272: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2377 "./glsl.g"
+#line 2419 "./glsl.g"
 
 case 273: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2384 "./glsl.g"
+#line 2426 "./glsl.g"
 
 case 274: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2391 "./glsl.g"
+#line 2433 "./glsl.g"
 
 case 275: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2398 "./glsl.g"
+#line 2440 "./glsl.g"
 
 case 276: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2405 "./glsl.g"
+#line 2447 "./glsl.g"
 
 case 277: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2412 "./glsl.g"
+#line 2454 "./glsl.g"
 
 case 278: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2419 "./glsl.g"
+#line 2461 "./glsl.g"
 
 case 279: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2426 "./glsl.g"
+#line 2468 "./glsl.g"
 
 case 280: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2433 "./glsl.g"
+#line 2475 "./glsl.g"
 
 case 281: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2440 "./glsl.g"
+#line 2482 "./glsl.g"
 
 case 282: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2447 "./glsl.g"
+#line 2489 "./glsl.g"
 
 case 283: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2454 "./glsl.g"
+#line 2496 "./glsl.g"
 
 case 284: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2461 "./glsl.g"
+#line 2503 "./glsl.g"
 
 case 285: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2468 "./glsl.g"
+#line 2510 "./glsl.g"
 
 case 286: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2475 "./glsl.g"
+#line 2517 "./glsl.g"
 
 case 287: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2482 "./glsl.g"
+#line 2524 "./glsl.g"
 
 case 288: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2489 "./glsl.g"
+#line 2531 "./glsl.g"
 
 case 289: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2496 "./glsl.g"
+#line 2538 "./glsl.g"
 
 case 290: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2503 "./glsl.g"
+#line 2545 "./glsl.g"
 
 case 291: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2510 "./glsl.g"
+#line 2552 "./glsl.g"
 
 case 292: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2517 "./glsl.g"
+#line 2559 "./glsl.g"
 
 case 293: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2524 "./glsl.g"
+#line 2566 "./glsl.g"
 
 case 294: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2531 "./glsl.g"
+#line 2573 "./glsl.g"
 
 case 295: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2538 "./glsl.g"
+#line 2580 "./glsl.g"
 
 case 296: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2545 "./glsl.g"
+#line 2587 "./glsl.g"
 
 case 297: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2552 "./glsl.g"
+#line 2594 "./glsl.g"
 
 case 298: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2559 "./glsl.g"
+#line 2601 "./glsl.g"
 
 case 299: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2566 "./glsl.g"
+#line 2608 "./glsl.g"
 
 case 300: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2573 "./glsl.g"
+#line 2615 "./glsl.g"
 
 case 301: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2580 "./glsl.g"
+#line 2622 "./glsl.g"
 
 case 302: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2587 "./glsl.g"
+#line 2629 "./glsl.g"
 
 case 303: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2594 "./glsl.g"
+#line 2636 "./glsl.g"
 
 case 304: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2601 "./glsl.g"
+#line 2643 "./glsl.g"
 
 case 305: {
-    ast(1) = new (_engine->pool()) TranslationUnit(sym(1).declaration_list);
+    ast(1) = makeAstNode<TranslationUnit>(sym(1).declaration_list);
 }   break;
 
-#line 2608 "./glsl.g"
+#line 2650 "./glsl.g"
 
 case 306: {
-    sym(1).declaration_list = new (_engine->pool()) List<Declaration *>(sym(1).declaration);
+    sym(1).declaration_list = makeAstNode< List<Declaration *> >(sym(1).declaration);
 }   break;
 
-#line 2615 "./glsl.g"
+#line 2657 "./glsl.g"
 
 case 307: {
-    sym(1).declaration_list = new (_engine->pool())  List<Declaration *>(sym(1).declaration_list, sym(2).declaration);
+    sym(1).declaration_list = makeAstNode< List<Declaration *> >(sym(1).declaration_list, sym(2).declaration);
 }   break;
 
-#line 2622 "./glsl.g"
+#line 2664 "./glsl.g"
 
 case 308: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2629 "./glsl.g"
+#line 2671 "./glsl.g"
 
 case 309: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2636 "./glsl.g"
+#line 2678 "./glsl.g"
 
 case 310: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2643 "./glsl.g"
+#line 2685 "./glsl.g"
 
 case 311: {
     // ast(1) = new ...AST(...);
 }   break;
 
-#line 2650 "./glsl.g"
+#line 2692 "./glsl.g"
 
 case 312: {
     ast(1) = 0;
 }   break;
 
-#line 2658 "./glsl.g"
+#line 2700 "./glsl.g"
 
 } // end switch
 } // end Parser::reduce()
diff --git a/src/libs/glsl/glslparser.h b/src/libs/glsl/glslparser.h
index 22841728ade5ae33011d3dcc8ea4d7567779bcb7..69d8008bf187028084b1a9ef30c6746b2b2067dd 100644
--- a/src/libs/glsl/glslparser.h
+++ b/src/libs/glsl/glslparser.h
@@ -33,6 +33,7 @@
 #include "glslparsertable_p.h"
 #include "glsllexer.h"
 #include "glslast.h"
+#include "glslengine.h"
 #include <vector>
 #include <stack>
 
@@ -70,10 +71,51 @@ private:
     inline int tokenKind(int index) const { return _tokens.at(index).kind; }
     void reduce(int ruleno);
 
+    template <typename T>
+    T *makeAstNode()
+    {
+        T *node = new (_engine->pool()) T ();
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
+    template <typename T, typename A1>
+    T *makeAstNode(A1 a1)
+    {
+        T *node = new (_engine->pool()) T (a1);
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
+    template <typename T, typename A1, typename A2>
+    T *makeAstNode(A1 a1, A2 a2)
+    {
+        T *node = new (_engine->pool()) T (a1, a2);
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
+    template <typename T, typename A1, typename A2, typename A3>
+    T *makeAstNode(A1 a1, A2 a2, A3 a3)
+    {
+        T *node = new (_engine->pool()) T (a1, a2, a3);
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
+    template <typename T, typename A1, typename A2, typename A3, typename A4>
+    T *makeAstNode(A1 a1, A2 a2, A3 a3, A4 a4)
+    {
+        T *node = new (_engine->pool()) T (a1, a2, a3, a4);
+        node->lineno = yyloc >= 0 ? (_tokens[yyloc].line + 1) : 0;
+        return node;
+    }
+
 private:
     Engine *_engine;
     int _tos;
     int _index;
+    int yyloc;
     std::vector<int> _stateStack;
     std::vector<int> _locationStack;
     std::vector<Value> _symStack;