Ваша грамматика неоднозначна и рекурсивна справа и слева.Из моего (ограниченного) знания о синтаксических анализаторах я знаю, что большинство генераторов синтаксических анализаторов невозможно проанализировать.
Это неоднозначно, потому что val_expr ADD val_expr SUB val_expr
можно анализировать как:
ADD
/ \
val_expr SUB
/ \
val_expr val_expr
и
SUB
/ \
ADD val_expr
/ \
val_expr val_expr
Я никогда не использовал Java CUP, но вот как я делал подобное, используя другой генератор синтаксического анализатора:
val_expr ::=
expr1 (SUB | ADD | <add all your operators here>) val_expr
| expr1 ;
expr1 ::=
NIL | BOOL_CONST | INT_CONST | CHAR_CONST | <etc> ;
Это делает грамматику однозначной и только праворекурсивной, что можетбыть обработанным всеми генераторами синтаксического анализатора, о которых я знаю.
Негативный аспект этой грамматики заключается в том, что у вас нет приоритета, но Java CUP, вероятно, имеет другой способ указать приоритет.
Редактировать : исправлено первое правило грамматики.