Представление AST в C с различными структурами для типов узлов

Вам нужно знать о базе данных Olson tz , которая доступна из ftp://elsie.nci.nih.gov/pub http: / /iana.org/time-zones/. Он обновляется несколько раз в год, чтобы иметь дело с часто последними изменениями в том, когда (и будет ли) переключаться между зимним и летним (стандартным и летним) временем в разных странах мира. В 2009 году последний выпуск был выпущен в 2009 году; в 2010 году это было 2010n; в 2011 году это было 2011n; в конце мая 2012 года релиз был 2012c. Обратите внимание, что существует набор кода для управления данными и фактическими данными самого часового пояса в двух отдельных архивах (tzcode20xxy.tar.gz и tzdata20xxy.tar.gz).

Это источник имен часовых поясов, таких как America / Los_Angeles (и синонимы, такие как US / Pacific).

Если вам нужно для отслеживания различных зон, вам нужна база данных Olson. Как сообщали другие, вы также хотите сохранить данные в фиксированном формате & mdash; Обычно UTC - это выбранный вариант; наряду с записью часового пояса, в котором были созданы данные. Вы можете различать смещение от UTC в момент времени и имя часового пояса; это может изменить ситуацию позже. Кроме того, зная, что в настоящее время 2010-03-28T23: 47: 00-07: 00 (US / Pacific) может или не поможет вам интерпретировать значение 2010-11-15T12: 30 & mdash; который, по-видимому, указан в PST (Pacific Standard Time), а не в PDT (Pacific Daylight Saving Time).

Стандартные интерфейсы библиотеки C не очень полезны для такого рода вещей.


Данные Олсона переместились, частично потому, что AD Olson скоро уйдет в отставку, а отчасти из-за того, что был подан иск (в настоящее время уволен) против сопровождающих за нарушение авторских прав. База данных часовых поясов теперь управляется под эгидой IANA , авторитета Интернет-назначенных номеров, а на первой странице есть ссылка на «База данных Часовой пояс» . Список рассылки для обсуждения теперь tz@iana.org; список объявлений - tz-announce@iana.org.

0
задан kpaul 30 March 2019 в 22:34
поделиться

1 ответ

Я бы сделал это в C, используя struct с членом union:

typedef struct ast_function
{        
    ast_node* arguments;
    symbol* sym;
} ast_function;

typedef struct ast_while
{
    ast_node* condition;
    ast_node* while_branch;
} ast_while;

typedef struct ast_assignment
{
    symbol* sym;
    ast_node* value;
} ast_assignment;

/* Etc. */

typedef struct ast_node {
  int node_type;
  /* See anonymous unions in any C reference */
  union {
    ast_function   function_data;
    ast_while      while_data;
    ast_assignment assignment_data;
    /* Etc. */
  };
}

Тогда вам вообще не нужны приведения:

[111 ]

Если вы сделаете node_type вместо int вместо [116], компилятор сможет предупредить вас, если вы упустите возможность в своем выражении switch.

0
ответ дан rici 30 March 2019 в 22:34
поделиться
Другие вопросы по тегам:

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