Хорошо. Если вы действительно хотите сделать это вручную: - (
Эта проблема состоит из двух частей:
- Лексический анализ
- Синтаксический анализ.
- Мы можем игнорировать Симантический анализ, потому что именно поэтому.
Сначала вы должны токенизировать входной поток в резонируемые токены. Слова были бы выбором obvios, но это оставило бы много работы для синтаксической фазы. Поэтому я бы сгруппировал ваши слова по следующим типам (Соединение, Существительное, Глагол, Статья), а затем написал лексер для возврата правильных лексем.
Lexer.cpp
enum Lexeme { END,Conjunction,Noun,Verb,Article };
Lexem getNextLexme(std::istream in)
{
std::string word;
in >> word;
if (!in) {return END;}
if (word == "and") return Conjunction;
else if (word == "birds") return Noun;
else if (word == "fly") return Verb;
else if (word == "the") return Article;
... etc
}
Так что теперь вы можете написать свой синтаксический парсер в терминах упрощенного потока токенов.
bool ParseSentence(std::istream in)
{
Lexeme token = getNextLexme(in);
switch(token)
{
case Noun: if (!parseVerb(in))
{ return false;
}
return parseConjunctionOrEnd(in);
case Article: return ParseSentence();
case END: return true;
}
}
bool parseVerb(std::istream in)
{
Lexeme token = getNextLexeme(in);
if (token != Verb) { /*ERROR*/ return false;}
return true;
}
// etc
Другой вариант с синтаксическим анализом - создать таблицу состояний. Но это включает ручной анализ грамматики и определение состояний. Это должно сопровождаться только самыми простыми грамматиками, все, что больше, чем у вас здесь, должно быть оставлено инструментам, которые могут автоматически генерировать таблицу состояний.
Итак, принимая грамматику, которую я определил в своем оригинальном посте ниже:
И надеюсь, что я все понял правильно, потому что я не закаленный инструмент: -)
State 1: Start <Nothing Happened>
Article -> State 2
Noun -> State 3
Otherwise Error
State 2: Seen Article.
Noun -> State 3
Otherwise Error
State 3: Seen Noun in Sentence.
Verb -> State 4
Otherwise Error
State 4: Seen Noun Verb
End -> State 5
Conjunction -> State 1
State 5: Finished:
State 0: Error State.
int stateTable[][] // CurrentState,CurrentObject
= {/*State 0: Error State:*/{},
// END,Conjunction,Noun,Verb,Article
/*State 1: Start*/ { 0, 0, 3, 0, 2},
/*State 2: Article*/ { 0, 0, 3, 0, 0},
/*State 3: Noun*/ { 0, 0, 0, 4, 0},
/*State 4: Noun Verb*/ { 5, 1, 0, 0, 0},
/*State 5: End*/ {}
};
bool parseSentence(std::iostream& in)
{
int currentState = 1;
while((currentState != 0) && (currentState != 5))
{
int token = getNextLexme(in);
currentState = stateTable[currentState][token];
}
return currentState == 5;
}