Есть ли другое решение проблемы «висящего другого», кроме «сопоставить ближе»?

9

Следующая контекстно-свободная грамматика представляет неоднозначность типа «висящее другое» (представьте, что обозначает, а обозначает, а обозначает какой-то другой вид инструкции или блока): Например, может быть проанализирован как или как (это самое простое / самое короткое неоднозначное слово для этой грамматики).б с Saif expr thenbelsec aacbc(a(acbc))(a(ac)bc)

SaSbS|aS|c
aacbc(a(acbc))(a(ac)bc)

«Стандартный» способ разрешить эту «неопределенную неопределенность» заставляет оператор «else» ( ) соединяться с ближайшим / внутренним «if-then» ( ). Это можно сделать следующим образом: Эта грамматика однозначна. В приведенном выше примере он анализ .а сba (a(acbc))

SaTbS|aS|cTaTbT|c
(a(acbc))

Вопрос: Есть ли другой естественный способ устранить неоднозначность, которая заставила бы анализировать ? Другими словами, я ищу грамматику, которая генерирует тот же язык, что и два выше, однозначно, и который анализирует как .a a c b c a a c b c ( a ( a c ) b c )(a(ac)bc)aacbcaacbc(a(ac)bc)

Замечание: Моя первая попытка была следующей: который разрешает неоднозначность мере необходимости - но эта грамматика все еще неоднозначна: может быть проанализирован как или как . aacbcaacbacbc(a(ac)b(acbc))(a(acb(ac))bc)

SaSbS|aU|cUaU|c
aacbcaacbacbc(a(ac)b(acbc))(a(acb(ac))bc)
Gro-Цэнь
источник
1
И в вашем последнем примере, какой из двух возможных разборов вы считаете «естественным» или правильным и почему?
Ричи
@rici Да, это сложный вопрос! И я не знаю. Я буду счастлив с однозначной грамматикой, которая производит либо разбор . Что меня больше всего волнует, так это то, что (с большим количеством 's, чем ' s) сопоставляет тый последний с тым (и оставляет внутреннюю точку бесподобной). a a a a a a c b c b c b c a b k b k a aaacbacbcaaaaaacbcbcbcabkbkaa
Гро-Цен

Ответы:

7

ababcb

Традиционное «сопоставление ближайшего» висячего разрешения сопоставляет каждое закрытие с самым последним, еще не имеющим аналогов открытием. Это означает, что между совпадающим открытием и его совпадающим закрытием никогда не бывает непревзойденного открытия (или закрытия).

(()())

Это сопоставление должно быть выполнено снаружи, так что сопоставление для закрытия не предпринимается, пока не будут сопоставлены все включающие пары. Этот факт делает невозможным создание анализа с помощью алгоритма ограниченного просмотра, так как анализ должен работать внутрь с обоих концов, после разделения строки на полностью совпадающие сегменты (поскольку они эффективно ограничивают диапазон потенциальных совпадений).

Однако тот факт, что парсер слева направо не существует, не означает, что не существует однозначного CFG. (Очевидно: палиндромный язык должен быть проанализирован с обоих концов к середине, но легко написать однозначную грамматику).

Чтобы создать грамматику для проблемы круглых скобок с «самым дальним соответствием», я опирался на тот факт, что за несоответствующим открытием не может следовать сопоставленное открытие. Если бы это было так, свойство наименьшего совпадения не было бы применено, потому что несопоставленное открытие могло бы соответствовать закрытию сопоставленного открытия, поэтому тот факт, что оно не сопоставлено, нарушает свойство наивысшего соответствия.

Итак, вот немного неуклюжая грамматика:

SU|MUT|aUbT|aUbc|aMbUMaMbM|cTaT|ac

SMUaTaTTUUT

UUSMUSMUMU

Вероятно, есть лучший обходной путь, чем тот, который я выбрал. Но этот, кажется, работает, и он хорошо работает с анализатором GLR Бизона, который я использовал для его тестирования; этот синтаксический анализатор жалуется на неоднозначные разборы, если вы не пишете дополнительный код для обработки неоднозначности, и мне было лень это делать. Я протестировал его со строками до 20 открытых + закрытий, и, похоже, он дал однозначный анализ для каждой правильно вложенной последовательности, без создания анализа для неправильно вложенных последовательностей.

RICi
источник
Поздравить с достижением того, что я сделал, было, вероятно, невозможно! Я экспериментально проверил, что для слов длиной ≤16 эта грамматика действительно однозначна и генерирует те же слова, что и слова из моего вопроса. Теперь я должен подробно понять, как это работает!
Гро-Цен
SaSbT|aMbSMTaT|cU
0

Возьмите a + b + c + d + e и abcde. Есть два очевидных способа, как грамматика может их проанализировать, но есть один способ, который мы используем.

В случае с «болтающимся остальным» это не совсем то, как люди смотрят на это. Вместо этого синтаксис интерпретируется как «если», за которым следует ноль, один или несколько «еще, если», а затем необязательный «еще».

gnasher729
источник
acbacbacbc