Вы не можете использовать Yacc даже для первой части вашей проблемы: проверить, является ли предложение грамматическим. Естественные языки не имеют однозначных контекстно-свободных грамматик. Итак, вы делаете игрушечную программу, которая распознает ограниченное разнообразие предложений. Хорошо, давайте пройдем мимо этого и подумаем, как заставить игрушку манипулировать этим значением.
Просто создайте базу данных о глаголах, которая указывает, какие «аргументы» они принимают, например, функции в языке программирования: база данных указывает, какие субъекты выполняют этот глагол, с какими объектами, с использованием каких возможных инструментов, в какой ситуации и т. д.
например. «Собака написала стул с листиком». Мы ищем «запись» в нашей маленькой игрушечной базе данных и видим, что «собака» не входит в список возможных предметов, что (хотя глагол является переходным) «стул» не является возможным прямым объектом, и этот «лист» не возможный инструмент.
Таким образом, наша программа может отклонить предложение и указать одну или несколько из этих причин.
Это мало чем отличается от отклонения, скажем, A + B
, когда A
является целым числом, а B
является строкой или func(A, B, C)
, когда func
имеет только два аргумента.
Вам лучше делать это на языке, который легко обрабатывает символические представления. Задача выигрывает от возможности сопоставления с образцом в древовидных структурах.
Лекс и Якк на самом деле не придают такого значения такой задаче. По крайней мере, не обычные lex и Yacc, которые производят и взаимодействуют с кодом C.