Чи існує якийсь загальний алгоритм розбору CFG, який розпізнає EPAL?


23

EPAL, мова навіть паліндром, визначається як мова, породжена наступною однозначною без контексту граматикою:

Saa

Sbb

SaSa

SbSb

EPAL - це «бана» багатьох алгоритмів розбору: мені ще не доводилося стикатися з будь-яким алгоритмом розбору однозначних CFG, який може розібрати будь-яку граматику, що описує мову. Його часто використовують, щоб показати, що є однозначні CFG, які неможливо проаналізувати певним аналізатором. Це надихнуло моє запитання:

Чи існує якийсь алгоритм розбору, який приймає лише однозначні CFG, які працюють на EPAL?

Звичайно, можна створити спеціальний аналізатор з двома проходами для граматики, яка розбирає мову за лінійним часом. Мене цікавлять методи розбору, які не були розроблені спеціально з урахуванням EPAL.


1
Я майже боюся запитати: що не так з LL (1) шляхом рекурсивного походження?
Рафаель

3
Рекурсивний спуск, що не відкликається, не може впоратися з EPAL, оскільки мова не є LL (k) для жодного k. Рекурсивний спуск із зворотним відстеженням може впоратися з граматикою за час, але це загальний алгоритм з експоненціальною поведінкою в гіршому випадку, що я не шукаю. O(n2)
Олексій десять Бринк

O ( 2 N )O(N2) не є експоненціальним, а квадратичним. - експоненціальна. O(2N)
Віктор Стафуса

1
@Victor: зворотний трек має експоненціальну поведінку в деяких граматиках, тільки не в цій граматиці. Але, оскільки алгоритм, який працює над неоднозначними граматиками, знижує його як відповідь на моє запитання.
Олексій десять Бринк

1
@jmad: моя мета - не розбирати мову (це можна зробити тривіально в лінійний час), а скоріше задовольнити мою цікавість: я бачив, що вона використовується як приклад мови, яку неможливо розібрати методом розбору так багато разів, що мені цікаво, чи є якийсь метод розбору, який би його розпізнав.
Олексій десять Бринк

Відповіді:


14

Розгляньте наступний ескіз стратегії розбору на власний ризик.

Замість того, щоб читати дані лише з одного кінця, ми читаємо з обох сторін і шукаємо відповідні правила. Ми можемо це зробити в стилі рекурсивного спуску; у виклику знайдіть префікс та суфікс на вхід, таким чином, що існує правило , до на решті слова. Якщо немає відповідного правила, відхиліть слово.w v A w B v B ( )A()wvAwBvB()

Цей алгоритм аналізує всі лінійні, однозначні граматики. лінійний час, якщо всі пари правил і мають або ¹. Сюди входить EPAL. В іншому випадку нам потрібно заглянути вперед, щоб ми могли зайняти час.AwBvAwBvwpwvsvΘ(n2)

Ідея взагалі не працює для нелінійних граматик. Лінійні, але неоднозначні граматики взагалі не можна проаналізувати без зворотного відстеження (як мінімум, для негативних вводів).


  1. wpv означає, що і , тобто жодне слово не є префіксом іншого. подібний для суфіксів.wvvws

1
Відмінно! Саме те, що я шукав. Чудово, що мова, яка не є NLR для будь-якого , розбирається таким простим алгоритмом. kNLR(k)k
Олексій десять Бринк

1
Задумавшись над цим, я виявив незначну помилку у вашому описі: лінійна граматика однозначно, але немає такого унікального префікса, як ви його описуєте. Є ще унікальний префікс, але вам, можливо, доведеться зазирнути всередину нетерміналу, щоб отримати його, і ваш час роботи стає . Але ваш алгоритм працює на . O ( n 2 ) E P A LSaAb|aBb,Aa,BbO(n2)EPAL
Олексій десять Бринк

@AlextenBrink Хороший улов. Я відредагував це для обліку.
Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.