Итак, я проходил грамматику Java 8 и обнаружил следующие произведения для определенных нетерминалов:
MultiplicativeExpression:
UnaryExpression
MultiplicativeExpression * UnaryExpression
MultiplicativeExpression / UnaryExpression
MultiplicativeExpression % UnaryExpression
UnaryExpression:
UnaryExpressionNotPlusMinus
UnaryExpressionNotPlusMinus:
PostfixExpression
PostfixExpression:
Primary
Primary:
ArrayCreationExpression
ArrayCreationExpression:
new PrimitiveType DimExprs [Dims]
Обратите внимание, что я не перечислил все произведения для нетерминалов, которые появиться здесь. Я перечислил только те из них, которые я собираюсь использовать для создания оператора с синтаксической ошибкой в Java.
Итак, я использую производную для ArrayCreationExpression , чтобы получить new int[3][][]
Затем это значение уменьшается до Primary , которое затем уменьшается до PostfixExpression и так далее, пока создание массива не будет окончательно уменьшено до UnaryExpression . Используется для получения MultiplicativeExpression следующего вида:
3 * new int[3][][]
Используется для формирования конструкции, которая сводится к нетерминальному Назначение (чьи произведения я здесь не перечислил). Эта конструкция: `` `num = 3 * new int [3] [] []` `
Теперь при компиляции следующего Java кода:
import java.util.Scanner;
public class JavaExample
{
public static void main(String[] args)
{
int num3;
num3 = 5 * new int[3][][];
}
}
дает следующая ошибка:
prog.java:7: error: bad operand types for binary operator '*'
num3 = 5 * new int[3][][];
^
first type: int
Как код, сгенерированный с использованием Java грамматики, может дать синтаксическую ошибку при компиляции?
Java 8 грамматика: https://docs.oracle.com/javase/specs/jls/se8/html/jls-19.html
Правила, которые я здесь использовал, перечислены под заголовком Произведения из §15 (выражения)