File: substituteblock.cc

package info (click to toggle)
bisonc%2B%2B 6.09.02-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,984 kB
  • sloc: cpp: 9,375; ansic: 1,505; fortran: 1,134; makefile: 1,062; sh: 526; yacc: 84; lex: 60
file content (35 lines) | stat: -rw-r--r-- 1,137 bytes parent folder | download | duplicates (6)
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();
}