Форум: "Прочее";
Текущий архив: 2008.05.25;
Скачать: [xml.tar.bz2];
ВнизСинтаксический анализ Найти похожие ветки
← →
TRSteep © (2008-04-09 15:37) [0]Разбираю код синтаксического анализатора.... не могу понять....
type TLexemeType=(ltEqual,ltLess,ltGreater,ltLessOrEqual,ltGreaterOrEqual,ltNotEqual,
ltPlus,ltMinus,ltOr,ltXor,
ltAsterisk,ltSlash,ltDiv,ltMod,ltAnd,
ltNot,
ltCap,
ltLeftBracket,ltRightBracket,
ltSin,ltCos,ltLn,
ltIdentifier,
ltNumber,
ltEnd);
PLexeme=^TLexeme;
TLexeme=record
LexemeType:TLexemeType;
Pos:Integer;
Lexeme:string
end;
TLexicalAnalyzer=class
private
FLexemeList:TList;
FIndex:Integer;
function GetLexeme:PLexeme;
procedure SkipWhiteSpace(const S:string;var P:Integer);
procedure ExtractLexeme(const S:string;var P:Integer);
procedure PutLexeme(LexemeType:TLexemeType;Pos:Integer;Lexeme:string);
procedure Number(const S:string;var P:Integer);
procedure Word(const S:string;var P:Integer);
public
constructor Create(const Expr:string);
destructor Destroy;override;
procedure Next;
property Lexeme:PLexeme read GetLexeme;
end;
...............
procedure TLexicalAnalyzer.PutLexeme(LexemeType:TLexemeType;Pos:Integer;Lexeme:string);
var NewLexeme:PLexeme;
begin
New(NewLexeme);
NewLexeme^.LexemeType:=LexemeType;
NewLexeme^.Pos:=Pos;
NewLexeme^.Lexeme:=Lexeme;
FLexemeList.Add(NewLexeme)
end;
Что здесь делает строкаPLexeme=^TLexeme;
?
и потом процедура эта...
полная статья http://www.delphikingdom.com/asp/viewitem.asp?catalogid=10
← →
DVM © (2008-04-09 15:39) [1]
> PLexeme=^TLexeme;?
определяет тип указатель на TLexeme
← →
TRSteep © (2008-04-09 15:44) [2]DVM ©
А зачем это нужно?
← →
Kolan © (2008-04-09 15:45) [3]> А зачем это нужно?
Контр вопрос: А ты знаешь что такое указатель?
← →
DVM © (2008-04-09 15:48) [4]
> А зачем это нужно?
Чтобы был такой тип PLexeme. :)
Чаще всего используется (и в данном коде тоже), чтобы динамически выделять память под рекорды:
NewLexeme:= New(PLexeme);
...
Dispose(NewLexeme)
← →
clickmaker © (2008-04-09 15:50) [5]если лексему сделать классом, тогда можно не определять указатель
← →
Пробегал2... (2008-04-09 15:56) [6]разбирать синтаксический анализатор не зная что такое указатели?
Никогда не понимал смысла взрывать мозг без всякого эффекта.
← →
TRSteep © (2008-04-09 15:59) [7]Пробегал2
Лабораторная работа у меня синтаксический анализатор...
Указатели мы не проходили...
Type <идентификатор>=^<базовый тип>;
<базовый тип> - определяет тип элементов, на которые будет указывать указатель
Тип указатель - определяет множество значений дискретных переменных определенного типа, на которые может ссылаться соответствующий указатель.
Описание базового типа не обязательно должно предшествовать описанию указателя, но должен содержаться в том же разделе описи типов.
Вот как это понимать русским языком :(
← →
TRSteep © (2008-04-09 16:03) [8]
> Контр вопрос: А ты знаешь что такое указатель?
нет
> Чаще всего используется (и в данном коде тоже), чтобы динамически
> выделять память под рекорды:
Если можно объясните плиз на пальцах....
← →
Игорь Шевченко © (2008-04-09 16:04) [9]
> Лабораторная работа у меня синтаксический анализатор...
Не совсем понятно, у кого работа - у тебя или у посетителей форума ?
> Указатели мы не проходили...
Для понимания синтаксического анализа указатели не требуются. Для анализатора тоже.
Но эта...нафига тебе оно ? На улице погода стоит хорошая, радуйся жизни.
← →
TRSteep © (2008-04-09 16:06) [10]
> Не совсем понятно, у кого работа - у тебя или у посетителей
> форума ?
Я по анализатору то и не спрашиваю...
просто везде в примерах используют такую конструкцию...
> Для понимания синтаксического анализа указатели не требуются.
> Для анализатора тоже.Но эта...нафига тебе оно ?
чтобы хоть чуток уметь программировать
> Но эта...нафига тебе оно ? На улице погода стоит хорошая,
> радуйся жизни.
Если я не напишу этот анализатор пойду в дворники и буду радоваться хорошей погоде ;)
← →
Игорь Шевченко © (2008-04-09 16:11) [11]TRSteep © (09.04.08 16:06) [10]
Так я могу еще раз сказать, что для синтаксического анализатора указатели не требуются. Требуется разбиение входного текста на лексемы и проверка их на семантическое соответствие.
Хоть ты эти лексемы по Copy будешь из входной строки выделять - разницы, кроме как в скорости, не будет никакой, а понимание покажешь, чего, собстна, от лабы и требуется.
← →
DVM © (2008-04-09 16:12) [12]
> Если можно объясните плиз на пальцах....
указатель - это переменная, которая содержит адрес в памяти.
← →
TRSteep © (2008-04-09 16:14) [13]
> Игорь Шевченко ©
Я понимаю что можно написать и по другому, но как я понимаю программирование без использования классов а только процедурами тупиковый вариант (по крайней мере мне так разъяснили)
пытаюсь научиться думать как нужно...
← →
Пробегал2... (2008-04-09 16:21) [14]Игорь Шевченко © (09.04.08 16:11) [11]
Так я могу еще раз сказать, что для синтаксического анализатора указатели не требуются
я не понимаю как можно построить дерево исходов, если не использовать указатели.
← →
Игорь Шевченко © (2008-04-09 16:35) [15]Пробегал2... (09.04.08 16:21) [14]
Для этого тебе нужно изучить, что возможны синтаксические анализаторы без деревьев.
← →
Григорьев Антон © (2008-04-09 16:38) [16]Какой же это синтаксический анализатор? Это лексический анализатор. Синтаксический там как раз без указателей написан. И если вам нужен только синтаксический анализатор, непонятно, зачем вы взялись за самый сложный пример - чуть выше в статье есть такие. Или со всеми более ранними примерами вы уже полностью разобрались?
У вас есть три варианта дальнейших действий:
1. Взять книгу по Паскалю и разобраться с указателями.
2. Разобраться по статье, что делает лексический анализатор, и самостоятельно переписать его без использования указателей, как умеете (это вполне реально).
3. Дождаться, когда найдётся доброволец, который на форуме изложит вам теорию, которую вы можете прочитать самостоятельно в книге.
3-ий вариант я предлагаю не рассматривать в силу его полной фантастичности.
← →
TUser © (2008-04-09 16:49) [17]> Я понимаю что можно написать и по другому, но как я понимаю
> программирование без использования классов а только процедурами
> тупиковый вариант (по крайней мере мне так разъяснили)
> пытаюсь научиться думать как нужно...
>
Тебя обманули. Расскажи преподу, что Виндоус ХР написан без использования классов (не знаю, как Виста).
> я не понимаю как можно построить дерево исходов, если не использовать указатели.
Создай свой массив чего хочешь и храни ссылку на индекс в массиве. Например.
← →
DVM © (2008-04-09 16:53) [18]
> Расскажи преподу, что Виндоус ХР написан без использования
> классов
Это вряд ли. По крайней мере далеко не весь.
← →
TUser © (2008-04-09 16:59) [19]На Си его писали, а там классов нет. Возможно, для создания Калькулятора и иных второстепенных компонентов использовалась вся мощь MFC или еще чего-нибудь, но это не виндоус по сути.
← →
Игорь Шевченко © (2008-04-09 17:01) [20]
> Расскажи преподу, что Виндоус ХР написан без использования
> классов
Препода обманывать нехорошо. Ядро без классов, Часть, касающаяся GDI в подсистеме Win32 уже с классами.
← →
TUser © (2008-04-09 17:07) [21]Не знал. Значит, рассказать преподу про ядро. Тоже не хоть бы хны.
← →
TStas © (2008-04-09 19:37) [22]Тип - указатель нужен "потом". Не зря же вхоной текст на лексемы разбирают. Его же где-то хранить будут. Вот это самое "где-то" TList. То есть, можно где угодно, но я вот всегда в TList храню, да и все люди тоже. А TList, от которого анализатор унаследован, вообще-то не знает ничего о новом типе, а хранит просто указатели (нетипизированные). Вот именно за этим указатели и нужны здесь. procedure TLexicalAnalyzer.PutLexeme вся на них завязана. Наверно, есть еще и аналогичная процедура чтения из списка.
Конечно, PutLexeme написана явно криво, поскольку должна быть и GetLexeme, а они обе используют одинаковый код копирования лексемы, а почему он не выделен в отдельную процедуру - непонятно. Ведь его трудно отлаживать.
Мне кажется, я ответил на вопрос.
← →
TRSteep © (2008-04-10 06:02) [23]насколько я понял почитал книги и здесь на форуме - это ссылки в память на уже созданные объекты.
Потом еще у преподавателя спросил - и он предложил
Практически то же что и Григорьев Антон ©
> 2. Разобраться по статье, что делает лексический анализатор,
> и самостоятельно переписать его без использования указателей,
> как умеете (это вполне реально).
И что про указатели лучше вобще забыть и писать без них.
← →
Григорьев Антон © (2008-04-10 08:51) [24]
> TStas © (09.04.08 19:37) [22]
> Конечно, PutLexeme написана явно криво, поскольку должна
> быть и GetLexeme, а они обе используют одинаковый код копирования
> лексемы, а почему он не выделен в отдельную процедуру -
> непонятно. Ведь его трудно отлаживать.
GetLexeme использует код копирования лексемы? Интересно, а почему я об этом ничего не знаю?
Вообще-то, GetLexeme написана так:function TLexicalAnalizer.GetLexeme: PLexeme;
begin
Result := FLexemeList[FIndex]
end;
Тип PLeхеме введён как раз для того, чтобы GetLexeme ничего никуда не копировал, и синтаксический анализатор, получая от лексического очередную лексему, получал просто указатель на уже существующую в памяти структуру без относительно затратного копирования.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.05.25;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c