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