Как ["03C0"] соответствует грамматике <Ada Reference Manual> в Приложении P? - PullRequest
4 голосов
/ 28 сентября 2011

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

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

    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 работает следующим образом: перед отправкой исходного файла в синтаксический анализатор грамматики выполняется предварительная обработка . Предварительная обработка оценит значение Юникода, проверит, находится ли оно в допустимом широком наборе символов. Если он находится в допустимом широком наборе символов, он продолжит отправку в анализатор грамматики. В противном случае произойдет сбой.

1 Ответ

4 голосов
/ 28 сентября 2011

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

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

...