Commit 47e3ec08 by Jamie Madill

Add a helper method to parse invariant declarations.

This pulls out more functionality from the grammar into simple c++ source files. BUG=angle:711 Change-Id: I19121d710dc1543585361cb53a0deb2ea0479db9 Reviewed-on: https://chromium-review.googlesource.com/212938Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarNicolas Capens <capn@chromium.org>
parent 5c09702f
...@@ -1347,6 +1347,32 @@ TIntermAggregate* TParseContext::parseSingleInitDeclaration(TPublicType &publicT ...@@ -1347,6 +1347,32 @@ TIntermAggregate* TParseContext::parseSingleInitDeclaration(TPublicType &publicT
} }
} }
TIntermAggregate* TParseContext::parseInvariantDeclaration(const TSourceLoc &invariantLoc,
const TSourceLoc &identifierLoc,
const TString *identifier,
const TSymbol *symbol)
{
if (globalErrorCheck(invariantLoc, symbolTable.atGlobalLevel(), "invariant varying"))
{
recover();
}
if (!symbol)
{
error(identifierLoc, "undeclared identifier declared as invariant", identifier->c_str());
recover();
return NULL;
}
else
{
TType type(EbtInvariant);
type.setQualifier(EvqInvariantVaryingOut);
TIntermSymbol *symbol = intermediate.addSymbol(0, *identifier, type, identifierLoc);
return intermediate.makeAggregate(symbol, identifierLoc);
}
}
TIntermAggregate* TParseContext::parseDeclarator(TPublicType &publicType, TIntermAggregate *aggregateDeclaration, TSymbol *identifierSymbol, const TSourceLoc& identifierLocation, const TString &identifier) TIntermAggregate* TParseContext::parseDeclarator(TPublicType &publicType, TIntermAggregate *aggregateDeclaration, TSymbol *identifierSymbol, const TSourceLoc& identifierLocation, const TString &identifier)
{ {
if (publicType.type == EbtInvariant && !identifierSymbol) if (publicType.type == EbtInvariant && !identifierSymbol)
......
...@@ -129,6 +129,8 @@ struct TParseContext { ...@@ -129,6 +129,8 @@ struct TParseContext {
TIntermAggregate* parseSingleDeclaration(TPublicType &publicType, const TSourceLoc& identifierLocation, const TString &identifier); TIntermAggregate* parseSingleDeclaration(TPublicType &publicType, const TSourceLoc& identifierLocation, const TString &identifier);
TIntermAggregate* parseSingleArrayDeclaration(TPublicType &publicType, const TSourceLoc& identifierLocation, const TString &identifier, const TSourceLoc& indexLocation, TIntermTyped *indexExpression); TIntermAggregate* parseSingleArrayDeclaration(TPublicType &publicType, const TSourceLoc& identifierLocation, const TString &identifier, const TSourceLoc& indexLocation, TIntermTyped *indexExpression);
TIntermAggregate* parseSingleInitDeclaration(TPublicType &publicType, const TSourceLoc& identifierLocation, const TString &identifier, const TSourceLoc& initLocation, TIntermTyped *initializer); TIntermAggregate* parseSingleInitDeclaration(TPublicType &publicType, const TSourceLoc& identifierLocation, const TString &identifier, const TSourceLoc& initLocation, TIntermTyped *initializer);
TIntermAggregate* parseInvariantDeclaration(const TSourceLoc &invariantLoc, const TSourceLoc &identifierLoc, const TString *identifier, const TSymbol *symbol);
TIntermAggregate* parseDeclarator(TPublicType &publicType, TIntermAggregate *aggregateDeclaration, TSymbol *identifierSymbol, const TSourceLoc& identifierLocation, const TString &identifier); TIntermAggregate* parseDeclarator(TPublicType &publicType, TIntermAggregate *aggregateDeclaration, TSymbol *identifierSymbol, const TSourceLoc& identifierLocation, const TString &identifier);
TIntermAggregate* parseArrayDeclarator(TPublicType &publicType, const TSourceLoc& identifierLocation, const TString &identifier, const TSourceLoc& arrayLocation, TIntermNode *declaratorList, TIntermTyped *indexExpression); TIntermAggregate* parseArrayDeclarator(TPublicType &publicType, const TSourceLoc& identifierLocation, const TString &identifier, const TSourceLoc& arrayLocation, TIntermNode *declaratorList, TIntermTyped *indexExpression);
TIntermAggregate* parseInitDeclarator(TPublicType &publicType, TIntermAggregate *declaratorList, const TSourceLoc& identifierLocation, const TString &identifier, const TSourceLoc& initLocation, TIntermTyped *initializer); TIntermAggregate* parseInitDeclarator(TPublicType &publicType, TIntermAggregate *declaratorList, const TSourceLoc& identifierLocation, const TString &identifier, const TSourceLoc& initLocation, TIntermTyped *initializer);
......
...@@ -1072,21 +1072,8 @@ single_declaration ...@@ -1072,21 +1072,8 @@ single_declaration
} }
| INVARIANT IDENTIFIER { | INVARIANT IDENTIFIER {
VERTEX_ONLY("invariant declaration", @1); VERTEX_ONLY("invariant declaration", @1);
if (context->globalErrorCheck(@1, context->symbolTable.atGlobalLevel(), "invariant varying"))
context->recover();
$$.type.setBasic(EbtInvariant, EvqInvariantVaryingOut, @2); $$.type.setBasic(EbtInvariant, EvqInvariantVaryingOut, @2);
if (!$2.symbol) $$.intermAggregate = context->parseInvariantDeclaration(@1, @2, $2.string, $2.symbol);
{
context->error(@2, "undeclared identifier declared as invariant", $2.string->c_str());
context->recover();
$$.intermAggregate = 0;
}
else
{
TIntermSymbol *symbol = context->intermediate.addSymbol(0, *$2.string, TType($$.type), @2);
$$.intermAggregate = context->intermediate.makeAggregate(symbol, @2);
}
} }
; ;
......
...@@ -805,22 +805,22 @@ static const yytype_uint16 yyrline[] = ...@@ -805,22 +805,22 @@ static const yytype_uint16 yyrline[] =
730, 733, 744, 752, 760, 787, 792, 803, 807, 811, 730, 733, 744, 752, 760, 787, 792, 803, 807, 811,
815, 822, 878, 881, 888, 896, 917, 938, 948, 976, 815, 822, 878, 881, 888, 896, 917, 938, 948, 976,
981, 991, 996, 1006, 1009, 1012, 1015, 1021, 1028, 1031, 981, 991, 996, 1006, 1009, 1012, 1015, 1021, 1028, 1031,
1035, 1039, 1043, 1050, 1054, 1058, 1065, 1069, 1073, 1094, 1035, 1039, 1043, 1050, 1054, 1058, 1065, 1069, 1073, 1081,
1103, 1109, 1112, 1118, 1124, 1131, 1140, 1149, 1157, 1160, 1090, 1096, 1099, 1105, 1111, 1118, 1127, 1136, 1144, 1147,
1167, 1171, 1178, 1181, 1185, 1189, 1198, 1207, 1215, 1225, 1154, 1158, 1165, 1168, 1172, 1176, 1185, 1194, 1202, 1212,
1237, 1240, 1243, 1249, 1256, 1259, 1265, 1268, 1271, 1277, 1224, 1227, 1230, 1236, 1243, 1246, 1252, 1255, 1258, 1264,
1280, 1295, 1299, 1303, 1307, 1311, 1315, 1320, 1325, 1330, 1267, 1282, 1286, 1290, 1294, 1298, 1302, 1307, 1312, 1317,
1335, 1340, 1345, 1350, 1355, 1360, 1365, 1370, 1375, 1380, 1322, 1327, 1332, 1337, 1342, 1347, 1352, 1357, 1362, 1367,
1385, 1390, 1395, 1400, 1405, 1410, 1415, 1420, 1424, 1428, 1372, 1377, 1382, 1387, 1392, 1397, 1402, 1407, 1411, 1415,
1432, 1436, 1440, 1444, 1448, 1452, 1456, 1460, 1464, 1468, 1419, 1423, 1427, 1431, 1435, 1439, 1443, 1447, 1451, 1455,
1472, 1476, 1480, 1488, 1496, 1500, 1513, 1513, 1516, 1516, 1459, 1463, 1467, 1475, 1483, 1487, 1500, 1500, 1503, 1503,
1522, 1525, 1541, 1544, 1553, 1557, 1563, 1570, 1585, 1589, 1509, 1512, 1528, 1531, 1540, 1544, 1550, 1557, 1572, 1576,
1593, 1594, 1600, 1601, 1602, 1603, 1604, 1608, 1609, 1609, 1580, 1581, 1587, 1588, 1589, 1590, 1591, 1595, 1596, 1596,
1609, 1619, 1620, 1624, 1624, 1625, 1625, 1630, 1633, 1643, 1596, 1606, 1607, 1611, 1611, 1612, 1612, 1617, 1620, 1630,
1646, 1652, 1653, 1657, 1665, 1669, 1679, 1684, 1701, 1701, 1633, 1639, 1640, 1644, 1652, 1656, 1666, 1671, 1688, 1688,
1706, 1706, 1713, 1713, 1721, 1724, 1730, 1733, 1739, 1743, 1693, 1693, 1700, 1700, 1708, 1711, 1717, 1720, 1726, 1730,
1750, 1757, 1764, 1771, 1782, 1791, 1795, 1802, 1805, 1811, 1737, 1744, 1751, 1758, 1769, 1778, 1782, 1789, 1792, 1798,
1811 1798
}; };
#endif #endif
...@@ -3689,21 +3689,8 @@ yyreduce: ...@@ -3689,21 +3689,8 @@ yyreduce:
{ {
VERTEX_ONLY("invariant declaration", (yylsp[(1) - (2)])); VERTEX_ONLY("invariant declaration", (yylsp[(1) - (2)]));
if (context->globalErrorCheck((yylsp[(1) - (2)]), context->symbolTable.atGlobalLevel(), "invariant varying"))
context->recover();
(yyval.interm).type.setBasic(EbtInvariant, EvqInvariantVaryingOut, (yylsp[(2) - (2)])); (yyval.interm).type.setBasic(EbtInvariant, EvqInvariantVaryingOut, (yylsp[(2) - (2)]));
if (!(yyvsp[(2) - (2)].lex).symbol) (yyval.interm).intermAggregate = context->parseInvariantDeclaration((yylsp[(1) - (2)]), (yylsp[(2) - (2)]), (yyvsp[(2) - (2)].lex).string, (yyvsp[(2) - (2)].lex).symbol);
{
context->error((yylsp[(2) - (2)]), "undeclared identifier declared as invariant", (yyvsp[(2) - (2)].lex).string->c_str());
context->recover();
(yyval.interm).intermAggregate = 0;
}
else
{
TIntermSymbol *symbol = context->intermediate.addSymbol(0, *(yyvsp[(2) - (2)].lex).string, TType((yyval.interm).type), (yylsp[(2) - (2)]));
(yyval.interm).intermAggregate = context->intermediate.makeAggregate(symbol, (yylsp[(2) - (2)]));
}
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment