Бхатия писал:
Может кто-нибудь объяснить мне, что здесь происходит? Спасибо.
Допустим, ваш ввод:
if (A) if (B) return 1 else return 2
Ваша грамматика неоднозначна: синтаксический анализатор не "знает", как это интерпретировать. Это можно сделать двумя способами (я добавил фигурные скобки, чтобы подчеркнуть, к чему if
принадлежит блок else
):
1
if (A)
{
if (B)
{
return 1
}
else
{
return 2
}
}
2
if (A)
{
if (B)
{
return 1
}
}
else
{
return 2
}
Бхатия написал:
P.S. Когда я использую синтаксический предикат как ((ELSE)=>ELSE statement)?
, предупреждение исчезает. У меня тоже нет причин для этого.
Добавляя предикат до ELSE
, вы заставляете синтаксический анализатор выбирать вариант № 1 (и синтаксический анализатор больше не предупреждает, потому что вы явно указываете ему выбирать альтернативу № 1 вместо № 2). Это приводит к тому, что не помещает туда предикат, но тогда ANTLR предупредит вас об этом и упомянет, что игнорирует параметр # 2, а также выберет # 1 (сообщение: "Как результат, альтернатива (ы) 2 были отключены для этого входа ").
Теперь, ответ на ваш вопрос в заголовке, "как убрать предупреждение" множественные альтернативы "?" , будет сделать вашу грамматику однозначной (или просто оставить предикат там, но понять, что там) никогда не будет синтаксическим анализом , как показано в варианте № 2!). Вы можете сделать это, введя какой-то оператор-блок-разделитель, такой как {
и }
. Или сделайте так, как это делает Python: сделайте так, чтобы количество пропущенных пробелов делало различие, которому принадлежат if
и else
. Выбор за вами.