Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.25;
Скачать: CL | DM;

Вниз

Синтаксический анализ   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.016 c
2-1209387942
switch
2008-04-28 17:05
2008.05.25
Графическое поле


4-1189364060
Rimd
2007-09-09 22:54
2008.05.25
enumWindows &amp; EnumChildWindows


2-1209108268
worldmen
2008-04-25 11:24
2008.05.25
Открыть файл в RichEdit только для чтения


15-1208107582
Дмитрий С
2008-04-13 21:26
2008.05.25
Нормальная java-аська


2-1209088087
San1712
2008-04-25 05:48
2008.05.25
Как программно выделить строку в компоненте TListView ?