yylval и объединение

Существует по крайней мере две причины.

Первый - безопасность http://www.javafaq.nu/java-article1060.html

главная причина, почему Строка, сделанная неизменной, была безопасностью. Посмотрите на этот пример: у Нас есть файл открытый метод с проверкой входа в систему. Мы передаем Строку этому методу для обработки аутентификации, которая необходима, прежде чем вызов будет передан ОС. Если Строка была изменяема, было возможно так или иначе изменить свое содержание после проверки аутентификации, прежде чем ОС получит запрос из программы тогда, возможно запросить любой файл. Таким образом, если Вы имеете право открыть текстовый файл в пользовательском каталоге, но тогда на лету, когда так или иначе Вам удается изменить имя файла, можно запросить открыть "passwd" файл или любого другого. Тогда файл может быть изменен, и будет возможно войти в систему непосредственно к ОС.

1110-секундный - эффективность Памяти http://hikrish.blogspot.com/2006/07/why-string-class-is-immutable.html

JVM внутренне поддерживает "Строковый Пул". К achive эффективность памяти JVM отошлет Строковый объект от пула. Это не создаст новые Строковые объекты. Так, каждый раз, когда Вы создаете новый строковый литерал, JVM зарегистрируется в пуле, существует ли это уже или нет. Если уже существующий в пуле, просто дайте ссылку на тот же объект или создайте новый объект в пуле. Будет много ссылочных точек к тем же Строковым объектам, если кто-то изменит значение, они будут влиять на все ссылки. Так, солнце решило сделать его неизменным.

17
задан neuromancer 5 December 2009 в 19:35
поделиться

2 ответа

Цель объединения - позволить хранить различные типы объектов в узлах, генерируемых flex.

Чтобы лучше объяснить, вы можете, например, :

%union
{
    int intValue;
    float floatValue;
    char *stringValue;
}

в .y , если вы хотите обеспечить базовую поддержку для типов int , float и string . Что вы можете с этим сделать?

Две вещи:

Во-первых, вы можете автоматически устанавливать правильные значения при генерации токенов. Подумайте о .

27
ответ дан 30 November 2019 в 11:22
поделиться

Объявление % union изменяет тип yylval .

В руководстве bison объясняется ]:

В обычном (не реентерабельном) анализаторе семантическое значение токена должно быть сохранено в глобальной переменной yylval . Когда вы используете только один тип данных для семантических значений, yylval имеет этот тип. Таким образом, если типом является int (по умолчанию), вы можете записать это в yylex :

 ...
yylval = значение; / * Помещаем значение в стек Bison. * /
return INT; / * Возвращаем тип токена. * /
...

Когда вы используете несколько типов данных, тип yylval представляет собой объединение, созданное из объявления % union (см. Раздел «Коллекция типов значений»). Поэтому, когда вы храните значение токена, вы должны использовать правильный член объединения. Если объявление % union выглядит так:

% union {
 int intval;
 двойной вал;
 symrec * tptr;
}

тогда код в yylex может выглядеть так:

 ...
yylval.intval = значение; / * Помещаем значение в стек Bison. * /
return INT; / * Возвращаем тип токена. * /
...
14
ответ дан 30 November 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: