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