Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.011 c
3-1197897575
Sergey13
2007-12-17 16:19
2008.05.25
План запроса в MySQL


15-1207803349
@!!ex
2008-04-10 08:55
2008.05.25
Комп пикает спикером, мышка зависает.


2-1209814797
Boris
2008-05-03 15:39
2008.05.25
Как сделать видимыми границы таблицы в Word ?


2-1209717817
holodok
2008-05-02 12:43
2008.05.25
Цикл


2-1209042308
Kolan
2008-04-24 17:05
2008.05.25
Где найти описание всех файлов которые создает Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский