1. В C++ не требуется объявление функции до ее вызова в классах, потому что компилятор автоматически выполняет предварительное объявление (forward declaration) всех функций класса при первом обнаружении их использования в коде. Это позволяет вызывать функции даже до их полного определения.
2. В классах не требуется использовать функцию "sum(int, int)" так, как это делается в данном фрагменте кода, потому что функция "sum" является методом класса и доступна через объект этого класса. Для вызова метода класса необходимо указать имя объекта, через которое будет осуществляться вызов метода.
3. Компиляторы C++ могут быть как однопроходными, так и двухпроходными, в зависимости от реализации и настроек компилятора. Однопроходные компиляторы обрабатывают и анализируют исходный код только один раз, в то время как двухпроходные компиляторы могут просматривать исходный код несколько раз для выполнения различных анализов и оптимизаций.
4. Компиляторы C++ обычно являются двухпроходными, поскольку требуют сначала синтаксического анализа и построения абстрактного синтаксического дерева (AST), а затем проведения различных анализов и оптимизаций на основе этого дерева. Подход с построением AST-дерева на лету, как в книге Дракона, также может быть применен при реализации компилятора C++.
5. Синтаксический анализ для классов осуществляется путем разбора синтаксической структуры класса и его методов. Компилятор анализирует ключевые слова, операторы, выражения и другие конструкции языка, чтобы определить правильность и смысл исходного кода. В период анализа также выполняются проверки типов, определение объявленных переменных и функций, а также решение возможных проблем с областью видимости.
6. Для классов синтаксический анализ применяет те же принципы, что и для функций, но с учетом особых правил, связанных с использованием классов, методов и наследования. Определение типов переменных и приведение типов выполняется с использованием информации о ранее объявленных классах и их методах. Синтаксический анализ также выполняет анализ обработки исключений, проверку допустимых операций и другие аспекты, специфичные для классов.
7. Чтобы определить, что это умножение или приведение типа "(A)*a", синтаксический анализатор основывается на контексте, в котором использовано выражение. Если в данном контексте ожидается тип данных и выражение может быть преобразовано в этот тип, то это будет рассматриваться как приведение типа. Если же в данном контексте ожидается операция умножения чисел, то это будет рассматриваться как умножение.
8. Определение