Я пишу очень простой синтаксический анализатор (в основном, чтобы лучше понять, как они работают), который вводит пользовательский ввод нескольких слов, определяет, является ли структура предложения ОК или не совсем, и выводит результат. Грамматика:
Приговор: Существительное глагол
Предложение статьи
Предложение о назначении предложения
Сопряжение: "а также" "или" "А"
Существительное: "птицы" "рыба" "С++"
Глагол: "правила" "Летать" "Плавать"
Статья: "Команда"
Написание грамматики было простым. Он реализует код, который дает мне некоторые проблемы. Мой psuedocode для этого:
main()
get user input (string words;)
while loop (cin >> words)
call sentence()
end main()
sentence()
call noun()
if noun() call verb() (if verb is true return "OK" ???)(else "not ok"???)
else if not noun() call article()
if article() call sentence() (if sentence is true "OK"???)(else "not"?)
else if not noun() call conjunction()
if sentence() conjunction() sentence() - no idea how to implement
return "OK"
else "not ok"
Итак, мой чрезвычайно неряшливый код psuedo. У меня есть несколько вопросов по его реализации.
-
Для функций слова (существительное, глагол и т.д.), как я должен проверять, являются ли они истинными? (как при проверке, если пользователь вводит птиц, рыбу, летать, плавать и т.д.)
-
Как мне обрабатывать вызов соединения и вывод?
-
Должен ли я обрабатывать выходные данные из основной функции или функций вызова?
-
Ни один из вышеперечисленных вопросов не имеет значения, если мой psuedo-код полностью ошибочен. Что-то не так с основами?
Как добавленное примечание, я нахожусь в главе 6: "Практика и принципы с использованием С++", поэтому я бы предпочел использовать синтаксис языка, который я уже изучил, поэтому все, что относится к категории расширенного программирования вероятно, не очень полезно. (В упражнении конкретно говорится, что не использовать жетоны, поэтому посчитайте их.)
Заранее спасибо
Последнее редактирование: в открытой группе книг я задал тот же вопрос, и Бьярне Страуструп прокомментировал, что он поставил решение для упражнений онлайн. В основном он вводил ввод в функцию предложения и использовал операторы if для возврата true или false. Однако он не использовал статьи, поэтому мой был намного сложнее. Думаю, если бы я научился чему-либо из этого упражнения, то, что, имея дело с большим количеством пользовательских входов, токенизация является ключевой (из того, что я знаю до сих пор.) Вот мой код на данный момент. Я могу вернуться к нему позже, потому что он по-прежнему очень глючит и в основном возвращается только в том случае, если предложение в порядке и не может обрабатывать такие вещи, как (существительное, соединение, предложение), но пока я продвигаюсь.
#include "std_lib_facilities.h"
bool article(string words)
{
if (words == "the")
return true;
else return false;
}
bool verb(string words)
{
if (words == "rules" || words == "fly" || words == "swim")
return true;
else return false;
}
bool noun(string words)
{
if (words == "birds" || words == "fish" || words == "c++")
return true;
else return false;
}
bool conjunction(string words)
{
if (words == "and" || words == "but" || words == "or")
return true;
else return false;
}
bool sentence()
{
string w1;
string w2;
string w3;
string w4;
cin >> w1;
if (!noun(w1) && !article(w1)) return false; // grammar of IFS!
cin >> w2;
if (noun(w1) && !verb(w2)) return false;
if (article(w1) && !noun(w2)) return false;
cin >> w3;
if (noun(w1) && verb(w2) && (w3 == ".")) return true;
if (verb(w2) && !conjunction(w3)) return false;
if (noun(w2) && !verb(w3)) return false;
if (conjunction(w3)) return sentence();
cin >> w4;
if (article(w1) && noun(w2) && verb(w3) && (w4 == ".")) return true;
if (!conjunction(w4)) return false;
if (conjunction(w4)) return sentence();
}
int main()
{
cout << "Enter sentence. Use space then period to end.\n";
bool test = sentence();
if (test)
cout << "OK\n";
else
cout << "not OK\n";
keep_window_open(); }