Анализатор на аритметични изрази, Всичко за програмирането в 1C Enterprise

Обучение по програмиране на 1C

Парсер за аритметични изрази

Какво е анализатор на изрази?

Анализаторът е програма, която съпоставя набор от лексеми във формален език с неговата граматика. Резултатът от анализа е дърво от лексеми, структурата на представения израз.

Анализаторът на аритметични изрази анализира оригиналния низ на формула на компоненти, които могат да включват признаци на аритметични операции, математически функции и променливи, и изчислява стойността на този израз.

За какво е парсерът?

Хората, които никога не са чували какво е анализатор, може да попитат: „Защо изобщо се нуждаем от анализатор?“

По-конкретно, анализаторът на изрази може да се използва в следните ситуации:

  • При изграждане на регулирано отчитане в 1C, където определени редове за отчитане се добавят според определени модели.
  • Изчисляване на формули, зададени от потребителя в системата.
  • Изграждане на ACS отчети с изчислени полета.
  • Динамични алгоритми, които могат лесно да се променят и се използват например за изчисляване на количеството документи.
  • Разбор на изрази в 1C заявки.

изисквания към анализатора.

Изискванията към алгоритъма на аритметичния анализатор трябва да бъдат както следва:

  1. Анализаторът трябва да анализира граматиката на официалния език с едно преминаване отляво надясно (за разлика от двупроходната обработка на граматиката в някои езици за програмиране).
  2. Анализаторът трябва да включва както лексикален, така и синтактичен анализ на изходния текст.
  3. Анализаторът трябва правилно да обработва изключенията.
  4. Анализаторът трябва да вземе предвид приоритета на извършваните операции.
  5. Анализаторът трябва да може да изчислява стандартни математически функции.

За да разберете по-добре на какъв алгоритъм е базиран този анализатор, разгледайте теорията за конструиране на формални граматики.

Формални граматики.

Помислете за пример на прост език, който дефинира подмножество от аритметични формули. Формулите могат да се състоят от знаци на аритметични операции, числа и скоби. Такъв език ще съдържа определени правила за изграждане на неговата граматика. Всяко правило има лява и дясна страна. В същото време от лявата страна на знака ? има само един нетерминален символ в правилото.

Наборът от крайни знаци в тази азбука ще бъде както следва:

Нетерминалната азбука е следната:

Езикови граматични правила:

1. Изразът е два израза, свързани със знак:

ИЗРАЖЕНИЕ ? ИЗРАЗИТЕЛЕН ЗНАК ИЗРАЖЕНИЕ

2. Изразът е число:

3. Изразът е израз в скоби:

4. Изразът е плюс или минус, или умножение, или деление:

5. Числото е цифра:

6. Числото е число и число:

НОМЕР ? ЧИСЛО ЦИФРА

7. Числото е или 0, или 1, ... или 9:

НОМЕР ? 0 1 2 3 4 5 6 7 8 9

Нека изведем формулата (25+3), като използваме правилата за извеждане на формалната граматика. Изходната последователност е показана по-долу, всяко текущо заместване е подчертано.

Правило #3: ИЗРАЖЕНИЕ? (ИЗРАЗ)

Правило #1: ( ИЗРАЗ ) ? ( ИЗРАЗ ЗНАК ИЗРАЗ )

Правило #4: (ИЗРАЗЯВАНЕ НА ЗНАК) ? (ИЗРАЗ + ИЗРАЗ)

Правило #2: (ИЗРАЗ + ИЗРАЗ) ? (ИЗРАЗ + ЧИСЛО )

Правило #5: (ИЗРАЗ + ЧИСЛО) ? (ИЗРАЗ + ЧИСЛО )

Правило #7: (ИЗРАЗ +НОМЕР)? (ИЗРАЗ + 3 )

Правило #2: ( ИЗРАЗ + 3) ? ( ЧИСЛО + 3)

Правило #6: ( ЧИСЛО + 3) ? (ЦИФРА НОМЕР + 3)

Правило #5: ( ЧИСЛО ЦИФРА + 3) ? ( ЦИФРА ЦИФРА + 3)

Правило #7: (ЦИФРА ЦИФРА + 3) ? (2 ЦИФРИ + 3)

Правило #7: (2 ЦИФРИ + 3) ? (2 5 + 3)

Софтуерно внедряване

Моята софтуерна реализация на анализатора на изрази на езика 1C включва анализиране на следните операции:

1. Аритметични действия: "+" (събиране), "-" (изваждане), "*" (умножение), "/" (деление).

2. Промяна на приоритета на операциите: "(" (отваряща скоба), ")" (затваряща скоба).

3. Операции за сравнение: "" (по-голямо от), "=" (по-голямо или равно на), "=" (равно на), "<>" (не е равно).

4. Математически функции:

  • Int(x1) – Цялата част от числото. Параметри: x1 – начално число;
  • Rv(x1, x2) - Закръгляване. Параметри: x1 – оригинално число, x2 – дължина на думата на полученото число. Ако параметърът е отрицателен, тогава първоначалното число се закръгля до съответната цифра на цялата част;
  • Ln(x1) – Натурален логаритъм. Параметри: x1 – начално число;
  • Lg(x1) - Десетичен логаритъм. Параметри: x1 – начално число;
  • Sin(x1) - Синус. Параметри: x1 – аргумент на функцията;
  • Cos(x1) - Косинус. Параметри: x1 – аргумент на функцията;
  • Tg(x1) – Тангенс. Параметри: x1 – аргумент на функцията;
  • Asin(x1) - арксинус. Параметри: x1 – аргумент на функцията;
  • Acos(x1) - Арккосинус. Параметри: x1 – аргумент на функцията;
  • Atg(x1) - Арктангенс. Параметри: x1 – аргумент на функцията;
  • Pow(x1, x2) - степенуване. Параметри: x1 – основа, x2 – показател;
  • Sqrt(x1) - Квадратен корен.Параметри: x1 – аргумент на функцията;
  • Abs(x1) - Модул на числото. Параметри: x1 – начално число;
  • Exp(x1) – Числото e на степен x1. Параметри: x1 – аргумент на функцията;
  • Pi(x1) – Числото pi на степен x1. Параметри: x1 – експонента;
  • Cmp(x1, x2, x3) – Условен скок. Ако x1>= 0, тогава cmp = x2, в противен случай cmp = x3. Параметри: x1 – число спрямо нула, x2, x3 – стойност на условието;
  • If(x1, x2, x3) – Условен скок. Ако x1 = 0, тогава if = x2, в противен случай if = x3. Параметри: x1 – число спрямо нула, x2, x3 – стойност на условието;
  • Min(…) – Минимална стойност;
  • Max(…) – Максимална стойност;
  • И(...) - Логически оператор "И";
  • Or(…) – Логически оператор „OR“.

5. Избор на символен низ: "'" (апостроф).

6. Таблични променливи: ( ). Намира клетка с конкретна стойност в подадената таблица. Например функцията Rev('522000') намира дадената стойност в колона "Ред" в реда с идентификатор "522000". Ако се намери повече от един такъв идентификатор, тогава стойностите на клетките се събират заедно.

Лексикален анализатор.

При предаване на текстов израз се използва лексикален анализатор, който извлича цели лексеми от входящия поток от знаци: значими знаци, числа, имена на функции, операции. По този начин лексикалния анализатор, вграден в анализатора, се използва като филтър на незначими знаци и като конструктор на твърди токени, което значително опростява анализа на израза.

Например, ако числото "5.78" се срещне в текста на израза, тогава лексикалния анализатор го възприема не като набор от знаци, а като единичен низ. Изразът "5,78 + 7,12" е набор от съответно 3 лексеми: 2 числа - "5,78" и "7,12" и 1операция - "+". Интервалите в израза се игнорират.

След това получените токени се предават на анализатора, за да извлече структурата му от формулата и след това да изчисли стойностите.

Синтактичен анализатор.

Анализаторът изгражда дърво от набор от токени от конвертирания израз чрез рекурсивно извикване на функции, които отговарят за определени правила. Дървото, изградено от анализатора, се свива според реда на извикванията на функцията в 1C, а изходът е една крайна стойност, която е стойността на целия аритметичен израз.

Кодът също така предоставя някои изключения, които анализират различни ситуации при анализиране на израз. Наборът от тези изключения в този случай е минимален и не отчита всички видове "изключителни" ситуации, но покрива повечето от грешките, които се случват.

Обработка 1C.

За пример за функционирането на анализатора на изрази е създадена обработката на "Формулен анализатор". Въвеждаме формулата, попълваме табличната част и натискаме бутона "Изпълни". В полето "Резултат" се появява резултатът от изчислението на формулата.

Примерът използва формулата: if( and( K1('Име'+1) >= abs((-1) * K2), 3 > 2), 2 + 3 * 4 - (143 + 211,50), sqrt(K1('Име'+2) + K2('Име2'))).