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_{};
}
|