Форум программистов, компьютерный форум CyberForum.ru

Парсер - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Переименование типов в подключаемом модуле http://www.cyberforum.ru/cpp-beginners/thread348975.html
Написал свой модуль для работы со связными списками, в которых хранится информация типа int, следовательно, в каждом объекте располагается переменная типа int и несколько методов для обработки. Для удобства переименовал int с помощью tipedef в data. Вопрос, можно ли в самой программе после подключения этого модуля переименовать другой требуемый тип в data, чтобы объекты подключаемого класса...
C++ Помогите с Шифром Цезаря Вообщем народ! Необходимо чтоб на вход поступала зашифрованная строка на латинице и далее выдавались все варианты перебора... Не могу понять как реализовать сдвиг:wall:, помогите... #include <iostream.h> #include <conio.h> int main(){ int shift=0; char alf={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',... http://www.cyberforum.ru/cpp-beginners/thread348971.html
Освобождение памяти, занятой вектором C++
У меня задача требует чтобы у вектора было в резерве не более 100 элементов. При постоянном росте вектора понятно как это обеспечить, а вот как быть при уменьшении количества элементов? Я не в курсе последних стандартов, подскажите есть ли сейчас способы гарантированного освобождения памяти, занятой вектором, и вообще какие способы существуют?
C++ Учебник Структуры и алгоритмы обработки данных
Добрый день... Посоветуйте пожалуйста какой нибудь электронный учебник по структурам и аглоритмам обработки данных где все понятным языком написанно... вот пример Полный справочник Шилдта по С С++
C++ Добавить символ '//' в строку http://www.cyberforum.ru/cpp-beginners/thread348839.html
Ребят, необходимо добавить символ // в массив char. Когда делаю так: const char сh = {"http://www.mail.ru" "http://www.yandex.ru" }; то компилятор, как вы понимаете, воспринимает это как комментарий и выдает ошибку.
C++ Переход на Visual C++ c Delphi Здрасте всем!! В общем начинал я с турбо паскаля, потом перешел на Delphi в общем писал я для себя некоторые програмки и какие то мелкие базки данных на заказ конторкам очень редко. Теперь решил поиграться с портами USB СОМ и понял что там все через одно место. Надо изучать Visual C. В общем поставил я Visual C++ Pro. Скачал учебники разные. Там даже не совпадает создание проэктов. И... подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.09.2011, 15:18     Парсер
Возник вопрос как лучше написать парсер. Интересно просто услышать советы.

Грамматика примерно такова.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* Grammar
 *
 * Expr : PrimaryCommand
 * PrimaryCommand : InsertCommand | SelectCommand | CreateCommand | DeleteCommand | AlterCommand | TruncateCommand |
 * UpdateCommand | DescCommand | ShowCommand | DropCommand | QuitCommand | HelpCommand
 * InsertCommand : insert Command Name Command ([Names]) Values
 * SelectCommand : select Names Command Name [Conditions]
 * CreateCommand : create Name (Names and Types)
 * DeleteCommand : delete Command Name [Conditions]
 * AlterCommand : alter Name Command [Names [and Types]]
 * TruncateCommand : truncate Name
 * UpdateCommand : update Name Command Names and Values [Conditions]
 * DescCommand : desc | describe Name
 * ShowCommand : show Name
 * DropCommand : drop Name
 * Help : help
 * QuitCommand : quit | exit
 * Names : list of Name
 * Name : name of table, variable ect
 * Command : one of from, where, into, values, set, add, change
 * Conditions : where Condition_
 * Condition_ : list of Condition linked by Operator
 * Condition : Name Oper | Func Value
 * Oper : one of =, <=, >=, !=, <, >
 * Value : string or number
 * Operator : and, or
 * Func : in ect.
 * Types : list of Type
 * Type : any of number, string
 * Names and Types : list of Name and Type 
 * Names and Values : list of Name Oper Type
 *
*/
Но это очень примерно.

Парсер написан сейчас примерно таким образом.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
namespace Tokens
{
 
enum Tokens_
{
    None_Token,
    Primary_Command_Token,
    Command_Token,
    Name_Token,
    Value_Token,
    Type_Token,
    Oper_Token,
    Func_Token
};
 
}
 
class Token
{
public:
    Token():token_type(Tokens::None_Token), value(std::string())
    {
    }
    Token(const Tokens::Tokens_& t_type, const std::string& val):token_type(t_type), value(val)
    {
    }
    std::string getValue() const 
    {
        return value;
    }
    Tokens::Tokens_ getType() const
    {
        return token_type;
    }
private:
    Tokens::Tokens_ token_type;
    std::string value;
};
        primary_commands = std::map<std::string, boost::function<bool(Parser*)>>
        {
            std::make_pair("create", &Parser::parseCreateCommand),
            std::make_pair("select", &Parser::parseSelectCommand),
            std::make_pair("insert", &Parser::parseInsertCommand),
            std::make_pair("delete", &Parser::parseDeleteCommand),
            std::make_pair("alter", &Parser::parseAlterCommand),
            std::make_pair("truncate", &Parser::parseTruncateCommand),
            std::make_pair("update", &Parser::parseUpdateCommand),
            std::make_pair("desc", &Parser::parseDescCommand),
            std::make_pair("describe", &Parser::parseDescCommand),
            std::make_pair("show", &Parser::parseShowCommand),
            std::make_pair("drop", &Parser::parseDropCommand),
            std::make_pair("quit", &Parser::parseQuitCommand),
            std::make_pair("exit", &Parser::parseQuitCommand),
            std::make_pair("help", &Parser::parseHelpCommand)
        };
        commands = std::map<std::string, boost::function<bool(Parser*)>>
        {
            std::make_pair("from", &Parser::parseFromCommand),
            std::make_pair("into", &Parser::parseIntoCommand),
            std::make_pair("set", &Parser::parseSetCommand),
            std::make_pair("values", &Parser::parseValuesCommand),
            std::make_pair("where", &Parser::parseWhereCommand)
        };
        types = {"number", "string"};
        opers = {'!', '>', '<', '='};
Главная функция такова.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    std::vector<Token> parse()
    {
        tokens.clear();
        std::string value;
        bool exit = false;
        while(exit != true)
        {
            Token last_token;
            if (!tokens.empty())
            {
                last_token = tokens.back();
            }
            switch(last_token.getType())
            {
                case Tokens::None_Token:
                {
                    value = getWithoutCharacters(" ");
                    if (primary_commands.find(value) == primary_commands.end())
                    {
                        std::cout << "Exception" << std::endl;
                        parserError("Expected primary command");
                    }
                    tokens.push_back(Token(Tokens::Primary_Command_Token, value));
                }
                break;
                case Tokens::Primary_Command_Token:
                {
                    exit = primary_commands[last_token.getValue()](this);
                }
                break;
            }
        }
        return tokens;
    }
Собственно вопрос один.

Как посоветовали бы сделать вы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 14:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru