1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
#include "parser.ih"
// Stack_offset is the number of values in the current alternative so far, so
// it is d_elements.size(). It indicates where to find $0 with respect to the
// top of the (?) stack.
// If nElements is negative then this is a mid-action block, automatically
// resulting in negative dollar indices
// $-expressions in blocks are filled by the scanner, calling d_block.dollar
// d_block.atIndex, d_block.dollarIndex, d_block.idIndex
void Parser::substituteBlock(int nElements, Block &block)
{
// Look for special characters. Do this from the end of the
// block-text to the beginning, to keep the positions of earlier
// special characters unaltered.
bool explicitReturn = false; // block return type as yet
// unknown
for (auto &atd: ranger(block.rbeginAtDollar(), block.rendAtDollar()))
{
if (not errIndexTooLarge(atd, nElements))
explicitReturn |=
(this->*(*d_atDollar)[atd.pattern()])(nElements, block, atd);
}
if (not explicitReturn)
warnMissingSemval();
}
|