2016-03-25 2 views
-2

В этом примере кода я использую const ref для вектора и проверяю условия в четырех функциях. Если был большой список каждого из условий (например, все глаголы в базе данных (например, английский словарь), было бы лучше проверить, что в классе Token перед передачей функции (поэтому функция просто получает значение глагол) или лучше, чтобы проверить внутри функции (так сама функция должна проверить базу данных)?Простой алгоритм анализа строк

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

bool full_stop_check(vector<string> &sentence); 
bool verb_check(vector<string> &sentence, int index); 
bool noun_check(vector<string> &sentence, int index); 
bool conj_arti_check(vector<string> &sentence, int index); 

int main() 
{ 
    vector<string> sentence; 
    string temp_word; 
    while(cin >> temp_word) 
    { 
     sentence.push_back(temp_word); 
    } 
    // Output test (commented out) 
    // for (string x : sentence) 
    // cout << x << '\n'; 

    // Check for sentence 
    if (full_stop_check(sentence)) 
     cout << "It is a sentence." << '\n'; 
    else 
     cout << "It is not a sentence." << '\n'; 
    return 0; 
} 
bool full_stop_check(vector<string> &sentence) 
{ 
    int index = sentence.size()-1; 
    // Full Stop Check 
    if (sentence[index] != ".") 
     return false; 
    --index; 
    if (index < 0) 
     return false; 
    return verb_check(sentence, index);   // full stop (not first character) 
} 
bool verb_check(vector<string> &sentence, int index) 
{ 
    // Verb Check 
    if (sentence[index] != "verb") 
     return false; 
    --index; 
    if (index < 0) 
     return false; 
    return noun_check(sentence, index);   // verb (not first word) 
} 
bool noun_check(vector<string> &sentence, int index) 
{ 
    // Noun Check 
    if (sentence[index] != "noun") 
     return false; 
    --index; 
    if (index < 0)        // first word is a noun 
     return true; 
    return conj_arti_check(sentence, index); // noun (not first word) 
} 
bool conj_arti_check(vector<string> &sentence, int index) 
{ 
    // Conjugation & Article Check 
    if (sentence[index] != "conjugation" && sentence[index] != "article") 
     return false; 

    // If it is either an article or conjugation 
    if (index == 0 && sentence[index] == "article") // first word is an article 
     return true; 
    else if (index == 0)       // first word not article (or noun) 
     return false; 
    else if (sentence[index] == "conjugation") { // conjugation 
     --index;   
     return verb_check(sentence, index); 
    } 
    else {           // article (not first word) 
     --index; 
     return conj_arti_check(sentence, index); // recursion 
    } 
} 
+0

_It is c оспаривание и работа в порядке, _... _Это элегантное решение? Что именно вы ищете? Консенсус, основанный на мнении, только на открытом форуме невозможен. – ryyker

+0

Есть ли что-то конкретное, что вы хотите улучшить? – DimChtz

+0

Очень правдиво, я думаю, мне было интересно, стоит ли работать назад на предложение. Это можно было сделать вперёд, но если он использовался для разбора нескольких предложений, он мог бы откусить их один за другим таким образом. Я не совсем уверен, что я ищу, просто полезный комментарий или два. ура – alexi2

ответ

1

теория вне контекста распознавателей свободного языка, как правило, на основе pushdown automaton (состояние машины с рекурсией). это довольно утомительно иметь дело с этим вручную, но легко автоматизировать, поэтому существует довольно много генераторов парсеров, таких как yacc, ANTLR или BOOST Spirit. Они просто берут грамматику языка и генерируют соответствующий код парсера.

Смежные вопросы