Я использую preg_match_all для создания простого парсера. Обратите внимание, что, поскольку он будет анализировать только несколько предложений, производительность не имеет значения. Можно ли создать синтаксический анализатор, который анализирует ниже контекстно-зависимую грамматику?
S -> NP VP
PP -> P NP
NP -> 'the' N | N PP | 'the' N PP
VP -> V NP | V PP | V NP PP
N -> 'cat'
N -> 'dog'
N -> 'rug'
V -> 'chased'
V -> 'sat'
P -> 'in'
P -> 'on'
Проблема, которую я не смог решить, была зациклена.
Например, вы видите цикл, в котором может быть PP -> NP -> PP и так далее?
Есть ли в PHP что-нибудь, что работает как автоматы Push-down, которые могут решить эту проблему?
Пример ввода: «кот погнался за собакой»
Пример вывода:
(S (NP the (N cat)) (VP (V погнался) (NP the (N dog))))
Пример ввода: «кошка преследовала собаку на ковре»
Пример выходных данных:
(S
(NP the (N cat))
(VP (V погнался) (NP the (N dog) (PP (P on) (NP the (N rug))))))
(S
(NP the (N cat))
(VP (V погнался) (NP the (N dog)) (PP (P on) (NP the (N rug)))))