File: setprecedence.cc

package info (click to toggle)
bisonc%2B%2B 6.09.02-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • 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 (39 lines) | stat: -rw-r--r-- 1,040 bytes parent folder | download | duplicates (2)
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
36
37
38
39
//#define XERR
#include "parser.ih"

Parser::STYPE_ Parser::setPrecedence(size_t type)
{
    if (d_rules.empty())
    {
        emsg << "`%prec " << d_matched << 
                "': `%prec' requires a non-empty production"  << endl;
        return STYPE_{};
    }

    Symbol *sp = 0;     // to prevent `sp uninitialized' warning by the
                        // compiler 

    switch (type)       // the %prec argument: either a named operator or
    {                   //                     a char-operator    
        case IDENTIFIER:
            sp = d_symtab.lookup(d_matched);
        break;

        case QUOTE:
            sp = d_symtab.lookup(d_scanner.canonicalQuote());
        break;
    }        

        // set the precedence of the current production rule.
        //
    if (sp && sp->isTerminal())
        d_rules.setPrecedence(Terminal::downcast(sp));
    else
        emsg << "`%prec " << d_matched << "': `" << d_matched << 
                "' must be a declared terminal token" << endl;

    return STYPE_{};
}