Я пытаюсь портировать старый лексер C ++ (источник) к JavaScript, и я немного борюсь с моим непониманием C / C ++.
У меня есть параметр c
который, как я сейчас вижу, может быть индексом позиции во входном файле, который я анализирую (*yy_cp
) или фактический (включая нуль) символ, сохраненный по этому адресу. Мне нужно использовать c
в качестве индекса в таблице поиска. Лексер делает это:
/* Promotes a possibly negative, possibly signed char to an
* unsigned integer for use as an array index. If the signed char
* is negative, we want to instead treat it as an 8-bit unsigned
* char, hence the double cast.
*/
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
и называет это так:
register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
который будет хранить значение таблицы поиска yy_ec
который содержит 256 записей (я предполагаю, расширенный ASCII), в yy_c
, Позиция для поиска генерируется YY_SC_TO_UI
и вот где я потерял портирование этого на JavaScript. YY_SC_TO_UI
должен вернуть число от 0 до 255, поэтому я просто беру то, что у меня есть, и:
"[c]".charCodeAt(0)
или есть еще что-то, что мне нужно знать о том, как обрабатывать «возможный отрицательный, возможный подписанный символ» в JS?
Благодарю.
В зависимости от компилятора char
может быть signed
или же unsigned
, Предположительно, автор хотел, чтобы это работало одинаково, и чтобы при преобразовании из значения всегда было нулевое расширение, а не расширение знака. char
в unsigned int
, Безопасный способ убедиться, что значение равно 0..255, а не -128..127.
Согласно MDN, диапазон возвращаемого значения charCodeAt больше:
Метод charCodeAt () возвращает целое число от 0 до 65535 …
От вашего ввода зависит, как вы хотите обрабатывать возможные значения вне диапазона, но одной альтернативой может быть простая битовая маскировка:
"€".charCodeAt(0) & 0xff;
Других решений пока нет …