Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / алгоритм разбора выражения / 5 сообщений из 5, страница 1 из 1
17.01.2017, 00:04
    #39385772
(o-O)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм разбора выражения
Доброго дня!
Подскажите пожалуйста идею или статью для изчения.
Задача у меня в анализе некоторого текстового выражения, которое может содержать некоторые формы математических выражений и в зависимости от этой формы Нужно выполнить инсерты в бд.

Примеры возможных форм и требуемые инсерты.
1) ... 200 руб... = вставить 1 запись с значением 200
2) ... 4*300 руб.... = вставить 4 записи с значением 300 в каждой из них
3) .... 4*200+300 руб.... =вставить 4 записи с значением 200 в каждой из них и одну запись с значением 300
4) ...100+200 руб.... = вставить одну запись с 100 руб и одну запись с 200 руб.

Это все варианты выражений. Между операциями могут быть или не быть пробелы..
Нужно написать какой то универсальный разборщик данных выражений.. Полаю что то типа синтаксического анализатора текста (видимо с использованием регулярных выражений) и что то типа рекурсий или построения семантического дерева для разбора выражения по операциям.... ?
...
Рейтинг: 0 / 0
17.01.2017, 02:06
    #39385791
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм разбора выражения
(o-O)2) ... 4*300 руб.... = вставить 4 записи с значением 300 в каждой из них

Рискну предположить что можно вставить 300 записей по 4 рубля и баланс будет
...
Рейтинг: 0 / 0
17.01.2017, 06:52
    #39385806
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм разбора выражения
Посмотри обратную польскую запись , там в т.ч. примеры разбора описаны.
...
Рейтинг: 0 / 0
18.01.2017, 06:07
    #39386560
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм разбора выражения
(o-O)Полаю что то типа синтаксического анализатора текста (видимо с использованием регулярных выражений) и что то типа рекурсий или построения семантического дерева для разбора выражения по операциям.... ?

описать грамматику, получится вменяемая -flex и bizon натравить
...
Рейтинг: 0 / 0
23.01.2017, 04:34
    #39389237
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм разбора выражения
(o-O)Примеры возможных форм и требуемые инсерты.
1) ... 200 руб... = вставить 1 запись с значением 200
2) ... 4*300 руб.... = вставить 4 записи с значением 300 в каждой из них
3) .... 4*200+300 руб.... =вставить 4 записи с значением 200 в каждой из них и одну запись с значением 300
4) ...100+200 руб.... = вставить одну запись с 100 руб и одну запись с 200 руб.

Это все варианты выражений.Если это все варианты, то можно не заморачиваться на какие-то продвинутые алгоритмы, а написать по-простому, например на C++:
Код: plaintext
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.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <stdexcept>
#include <stdio.h>

const int _undef_int = INT_MIN;

struct scan_context_t {
  const char* text;
  size_t pos;
};

void scan_spaces(scan_context_t* context) {
  const char* text = context->text;
  size_t p = context->pos;
  while (text[p] == ' ') p++;
  context->pos = p;
}

bool try_scan_tok(scan_context_t* context, const char tok[]) {
  size_t tl = strlen(tok);
  if (strncmp(context->text + context->pos, tok, tl) != 0)
    return false;
  context->pos += tl;
  return true;
}

void scan_tok(scan_context_t* context, const char tok[]) {
  if (!try_scan_tok(context, tok))
    throw std::runtime_error("Syntax error.");
}

inline bool is_digit(char c) {
  return ('0' <= c) && (c <= '9');
}

int scan_int(scan_context_t* context) {
  if (!is_digit(context->text[context->pos]))
    throw std::runtime_error("Syntax error.");
  char* end;
  int result = strtol(context->text + context->pos, &end, /*base:*/10);
  context->pos = end - context->text;
  return result;
}

void insert_records(int count, int price);

void insert_records_from_text(const char text[]) {
  scan_context_t sc = {text, /*pos:*/0};

  // пропускаем не-цифры
  for (;;) {
    if ((text[sc.pos] == '\0') || is_digit(text[sc.pos])) break;
    sc.pos++;
  }

  int count, price_1;
  int n = scan_int(&sc);
  scan_spaces(&sc);
  if (try_scan_tok(&sc, "*")) {
    count = n;
    scan_spaces(&sc);
    price_1 = scan_int(&sc);
    scan_spaces(&sc);
  } else {
    count = 1;
    price_1 = n;
  }

  int price_2 = _undef_int;
  if (try_scan_tok(&sc, "+")) {
    scan_spaces(&sc);
    price_2 = scan_int(&sc);
    scan_spaces(&sc);
  }

  scan_tok(&sc, "руб");

  printf("Parsed text '%s'.\n", text);
  insert_records(count, price_1);
  if (price_2 != _undef_int)
    insert_records(1, price_2);
  printf("\n");
}

void insert_records(int count, int price) {
  printf("Inserting %i record(s) with price %i.\n", count, price);
}

int main() {
  insert_records_from_text("... 200 руб...");
  insert_records_from_text("... 4*300 руб....");
  insert_records_from_text(".... 4*200+300 руб....");
  insert_records_from_text("...100+200 руб....");
  return 0;
}

Вывод на консоль:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Parsed text '... 200 руб...'.
Inserting 1 record(s) with price 200.

Parsed text '... 4*300 руб....'.
Inserting 4 record(s) with price 300.

Parsed text '.... 4*200+300 руб....'.
Inserting 4 record(s) with price 200.
Inserting 1 record(s) with price 300.

Parsed text '...100+200 руб....'.
Inserting 1 record(s) with price 100.
Inserting 1 record(s) with price 200.


(o-O)Между операциями могут быть или не быть пробелы..За это в моём коде отвечает функция scan_spaces.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / алгоритм разбора выражения / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]