Как [03C0] соответствует грамматике ‹Справочного руководства Ada› в Приложении P?

Я пишу инструмент для синтаксического анализа исходного файла Ada с грамматикой, представленной в приложении P.

  1. С помощью следующего фрагмента кода я знаю, что ["03C0"] означает "греческая буква Пи", но допустимо ли это имя переменной?

    01 package Ada.Numerics is
    02    Pi : constant := 3.14159_26535_89793_23846_26433_83279_50288_41971_69399_37511;
    03    ["03C0"] : constant := Pi;
    04    e : constant := 2.71828_18284_59045_23536_02874_71352_66249_77572_47093_69996;
    05 end Ada.Numerics;
    
  2. При использовании грамматики для синтаксического анализа строки 03 я сейчас перехожу к «basic_declaration». Какое следующее правило? А следующее следующее правило? Следующее следующее следующее правило? Пока ["03C0"] не будет успешно проанализирован. В конце концов, должен возникнуть вопрос: Какое правило проанализировано ["03C0"]?

Справочное руководство Ada находится по адресу: http://www.adaic.org/resources/add_content/standards/05rm/RM-Final.pdf

Справочное руководство по Ada, страница 702 в формате PDF, страница 676, в правом нижнем углу страницы. Приложение P / 3.1

    3.1
    basic_declaration ::=
        type_declaration | subtype_declaration
        | object_declaration | number_declaration
        | subprogram_declaration | abstract_subprogram_declaration
        | null_procedure_declaration | package_declaration
        | renaming_declaration | exception_declaration
        | generic_declaration | generic_instantiation

Я провел дополнительное расследование на основе ответа oenone.

  1. Если я использую ["03C0"] в коде, набор символов не обязательно должен быть "UTF-8", что имеет смысл. При компиляции мне нужен gnatmake -gnatWb Hello.adb.
  2. Если я использую p в коде, я должен изменить набор символов на «UTF-8», иначе GPS не распознает этот символ и выдаст сообщение. После того, как я изменил его на UTF-8, мне нужно использовать "gnatmake -gnatW8 Hello.adb" для компиляции.
  3. Я попытался изменить ["03C0"] на ["abcd"] и снова скомпилировать, это не удастся, сказав "недопустимый широкий символ в идентификаторе".
    УГАДАЮ: если ["03C0" ] анализируется только по грамматике, ["abcd"] также проходит проверку грамматики. Итак, исходя из результата и сообщения о сбое, я могу сказать, что GNAT работает следующим образом: перед отправкой исходного файла в синтаксический анализатор грамматики выполняется предварительная обработка. Предварительный процесс оценит значение Unicode, проверит, находится ли оно в допустимом широком наборе символов. Если он находится внутри допустимого набора широких символов, он продолжит отправку синтаксическому анализатору грамматики. В противном случае потерпите неудачу.

person milesma    schedule 28.09.2011    source источник


Ответы (1)


1: см. A.5 Пакет числовых данных - RM использует правильный символ Юникода. Кажется, ваша цитата из пакета GNAT. Для этого см. Руководство пользователя GNAT о том, как указать GNAT, какую кодировку он должен использовать.

2: Нет правила от ARM. Это вопрос кодировки, который решается реализацией (GNAT). ["03C0"] (с -gnatWb, который по умолчанию) обрабатывается как π (с -gnatW8) или даже Pi как действительный идентификатор для имени переменной (или в данном случае константы).

person Rommudoh    schedule 28.09.2011
comment
Спасибо, oenone, это действительно помогло. - person milesma; 29.09.2011