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