IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Парсер на классах
Triplet
сообщение 27.10.2008 21:24
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 78
Пол: Женский

Репутация: -  0  +


Всем добрый день!
Получила такое сумбурное задание, помогите, пожалуйста, разобраться.
Необходимо реализовать парсер арифметического выражения на классах.
Проблема как раз в этих классах, т.е., как я поняла, они должны быть реализованы таким образом:
type
TCustomToken=class //здесь должны храниться только литералы исходного выражения
private
FText: string;
public
property Text: string read fText; //должно быть св-ом
procedure LoadFromString(const S, Pos): Integer;
end;
TNumberToken=class //только цифры исходного выражения
private
FValue: Integer; //должно быть св-ом
public
property Value: Integer read FValue;
end;
TCustomTokens=class //всё выражение (должно считываться из двух предыдущих классов)
private
FCount: Integer; //должно быть св-ом
FItems: array [0..FCount-1] of Char; //должно быть св-ом
function GetSymbol(Index: Integer): ;
procedure SetSymbol(Index: Integer; Value: Longint);
public
property Count: Integer read FCount;
property Items[index: Integer]: Longint read GetCoord write SetCoord; //не уверена, что правильно оформила
end;


на форуме нашла такой код парсера
Постфиксная форма записи
http://volvo71.narod.ru/faq_folder/postfix.htm
там есть и ооп, но
подскажите, пожалуйста, как можно парсер оформить в виде именно этих классов. Как я поняла, каждый класс должен выступать в виде стека, и как правильно распорядиться свойствами классов?
Заранее большое спасибоsmile.gif)!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 28.10.2008 17:37
Сообщение #2


Гость






Значит, смотри: используются вот такие классы:

  Tok_Type = (_UNDEF, _NUMBER, _OPERATOR, _END);
TokenString = string[16];

tbase = class
tokType: Tok_Type;
constructor create;
end;
topertoken = class(tbase)
private
FValue: char;
public
constructor loadfromstring(const s: string; var p: integer);
constructor stop;
property Value: char read FValue write FValue;
end;
tnumbertoken = class(tbase)
private
FValue: double;
public
constructor loadfromstring(const s: string; var p: integer);
property Value: double read FValue write FValue;
end;


tcalc = object
function proceed(): double;
constructor create(lpszCommand: string);
destructor destroy(); virtual;

private
TokenValue: tbase;

procedure SetFunction(lpszCommand: string);
procedure GetToken(); virtual;
function mul_div(): double;

protected
pCurrPos: integer;
_Function: string;

function add_sub(): double;
function prim(): double; virtual;
end;
Предупреждаю сразу о нескольких вещах:
1) это работает только с арифметическими операциями/скобками/вещественными числами
2) все классы, кроме TCalc были прикручены в программу по принципу "чтобы было, потому что есть в задании", изначально в парсере использовалось только 2 класса, TCalc и TVarCalc (один для вычисления выражений без переменных, второй - для вычислений с участием переменных, второй класс в прикрепленную программу не вошел, из первого было вычищено все, что касается функций)
3) такую программу лично я никогда бы не принял. Еще раз: написано это - только для того, чтобы показать, насколько это бредово получается. Без этих "классов-довесков" программа выглядит намного стройнее и красивее;
4) на некоторых версиях Дельфи (до 2009) потребуется заменить конструкцию Exit(X) на
begin
result := X; Exit;
end;


Прикрепленные файлы
Прикрепленный файл  parser.pas ( 5.69 килобайт ) Кол-во скачиваний: 239
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 7:49
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"