![]() |
TParser
Кто может толково обьяснить что такое TPasrser?
Как я понял это модуль для C\C++ и для Delphi используя который можно при входном данном 'X' получить на выходе значение заданной функции 'Y' Например: y=5*x^2+x(x=2) он выдаст что y=22. Так ли это? И можно ли его как нить переделать под Паскаль? |
Цитата:
|
Как показывает моя практика - то что сделано через потоки можно переделать под без потоков В) Только оно вам надо? В)
|
Вложений: 1
Вот. Добрался. Лови:
На самом деле TParser не является синтаксическим анализатором, скорее это лексический анализатор, или сканер. Или, другими словами, входной поток признаков (tokens) в ASCII-коде. Вы довольно легко можете использовать эти "признаки" для парсирования выражения, используя простую рекурсию. Сделав это, вы можете произвести разбор вашего математического выражения практически любой сложности. TParser вам поможет, но рекурсивный анализатор придется создавать ручками. Код:
...простой пример, который мы хотим парсировать: (23.34 + 21.21) * 2.92 - 12.21 * sin (180) * -1 Expr ::= Term + Expr | Term - Expr | Term Term ::= Factor * Term | Factor / Term | Factor Factor ::= + Item | - Item | Item Item ::= ( Expr ) | Fn( Expr ) | Number Fn ::= Sin | Cos Number ::= floating point literal number (плавающая точка литерала числа) Далее идет модуль и форма, показывающие как это можно использовать. Вы должны скопировать текст формы в окно редактора Delphi и сохранить как DFM-файл. Мои расчеты вашего выражения привели к результату 130.086 - это правильно? Примечание: TParser имеет ошибку в подпрограмме парсирования плавающего числа. Любое сочетание символов с символами '+' или '-' воспринимается как часть плавающего числа, поскольку 1e+3 корректное выражение. Естественно, это должно быть правильным только в совокупности с символом 'e'. Поэтому вы должны убедиться, что перед символами '+' и '-' имеется хотя бы один пробел, как показано в вашем выражении. Вы можете это исправить (если у вас есть исходный код VCL), редактируя функцию TParser.NextToken. |
Текущее время: 23:25. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot