예제 #1
0
TerminalInfo getTerminalInfo(ParserTable& table, LineInfo info)
{
   TerminalInfo terminal;
   terminal.value = info.line;
   terminal.col = info.column;
   terminal.row = info.row;
   terminal.disp = info.position;
   terminal.length = info.length;
   switch (info.state) {
      case dfaQuote:
         terminal.symbol = tsLiteral;
         break;
      case dfaCharacter:
         terminal.symbol = tsCharacter;
         break;
      case dfaEOF:
         terminal.symbol = tsEof;
         terminal.value = _eof_message;
         break;
      case dfaIdentifier:
         terminal.symbol = tsIdentifier;
         break;
	   case dfaFullIdentifier:
         terminal.symbol = tsReference;
         break;
	   case dfaPrivate:
         terminal.symbol = tsPrivate;
         break;
	   case dfaInteger:
         terminal.symbol = tsInteger;
         break;
      case dfaLong:
         terminal.symbol = tsLong;
         break;
	   case dfaHexInteger:
         terminal.symbol = tsHexInteger;
         break;
	   case dfaReal:
         terminal.symbol = tsReal;
         break;
      case dfaWideQuote:
         terminal.symbol = tsWide;
         break;
	   default:
         terminal.symbol = (Symbol)table.defineSymbol(terminal);
   }
   return terminal;
}
예제 #2
0
int _registerSymbol(ParserTable& table, ident_t symbol, int new_id)
{
   int id = (int)table.defineSymbol(symbol);
   if (id == 0) {
      id = new_id;

      if ((symbol[0]<'A')||(symbol[0]>'Z'))
         id |= ParserTable::mskTerminal;

      table.registerSymbol(id, symbol);

      if (last_id < (id & ~mskAnySymbolMask)) last_id = id & ~mskAnySymbolMask;

      if (last_id >= mskTraceble) {
         printLine("WARNING: symbol id is overflown %d", last_id);
      }
   }
   return id;
}