Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];

Вниз

Как пишут интерпретаторы ?   Найти похожие ветки 

 
WhiteCat   (2002-08-28 20:00) [0]

Доброго времечка !

Люди, подскажите как под дельфями
пишется интерпретатор(встроеный язык,
типа Васика :). Может, есть отдельные
компоненты.
Можно, конечно, не только под дельфями.

Заранее благодарен !


 
wicked   (2002-08-28 20:32) [1]

руками пишутся....
если на пальцах, то интерпретатор состоит из
1) лексического анализатора...
2) синтаксического анализатора...
3) (возможно) семантического анализатора...
4) исполнительного механизма...

способы взаиможействия между этими частями могут быть самыми разнообразными...
для простого интерпретатора может подойти пакет tp lex yacc - сильно упрощает создание пунктов 1 и 2...
или можно найти компонент, который всё это делает... например, в Dream Controls, если я не ошибаюсь...


 
Юрий Зотов   (2002-08-29 01:43) [2]

Коротко, примерно так.

1. Строго расписывается входной язык (например, в виде БНФ или синтаксических диаграмм). В итоге получаем его алфавит, полный набор его лексем, ключевых слов и т.д.

2. Определяются таблица ключевых слов, таблица "односимвольных" нетерминалов и пр.

3. Пишется лексический анализатор. По минимуму, он состоит из процедуры, дающей очередной терминальный символ входного потока (с пропуском пробелов, комментариев и пр.) и процедуры, дающей текущую лексему.

4. Для каждой лексемы пишется обрабатывающая ее процедура. Как правило, этот этап не обходится без рекурсий. Здесь же ведется диагностика ошибок и здесь же может быть подключена семантика. Если обработка строится в один проход, такие процедуры должны включать в себя и исполнительный механизм.

5. Исполнительный механизм (собственно, сам интерпретатор). По минимуму, это работа с таблицами идентификаторов, созданными при лексическом анализе. Если язык предусматривает арифметические и/или логические выражения, тут же строится их разбор (часто на основе МП-автоматов и польской записи) и вычисление. И т.д.

Это лишь в самых общих чертах. Подробнее - см. в книгах (например Ахо и Ульман - классика!). По этой же теме в 70-х годах переводилась отличная книга Вирта (наверняка она у него не единственная). Ну, в общем, нужны любые книги по теории языков и компиляторов. Советую заглянуть в виртуальные книжные магазины, например Ахо и Ульмана я не так давно там встречал (кажется, на http://www.colibri.ru)


 
Ev_genus   (2002-08-29 05:07) [3]

Я писал но подробно рассказать не могу. Я использовал разбиение на лексепы. Например строка A:=1; содержит 4 лексемы. Проверка проходит так:
Считываем А. Проверяем, функций(и процедур) А нет, следовательно это переменная. Далее если необходимо, то создаём переменную. А если такая уже есть то запоминаем её.
Считываем :=. Присваивание.
Считываем 1. И вычисляем выражение "1". Вычисляем в любом случае, так как вместо "1" там может стоять "1+1"
Присваиваем А значение "1"

Лексема ";" используется для определения конца выражения.

Это приблизительная схема анализа простейщего выражения в Паскале. В других выражения и языках всё может быть по-другому.

Я читал Вирта. У него очень "красивые" и удобные синтаксические диаграммы. Советую и тебе почитать.


 
Digitman   (2002-08-29 08:43) [4]

>WhiteCat
Если ты силен в C, могу посоветовать поискать где-то в сети и практически исследовать исходники YACC.EXE (Yet Another Compiler Compiler).

Это - утилита для генерации текста готового к самому различному применению лексического и синтаксического парсера/анализатора/генератора, используемого, например, для построения небезызвестного IB-сервера (который исполняет тела SP/триггеров/дин.запросов именно в режиме интерпретации токенизированного кода).

На выходе YACC формирует текст С-модуля, который строит токенизированное дерево запроса. При определенном желании и упорстве можно транслировать текст YACC в Паскаль и доработать его для формирования выходного файла так же в синтаксисе Паскаля.



 
Polevi   (2002-08-29 09:19) [5]

а если тебе нужно готовое решение - проще всего использовать VB-script parser от Microsoft - бесплатен - входит в состав IE


 
Ketmar   (2002-08-29 09:30) [6]

а еще есть чудесная штука - InnerFuse Pascal Script. по поиску в гугле выдаст сайт. отличный интерпретатор паскаля с обертками для стандартных классов, возможностью (ограниченной) использования винапи и ты ды. в исходниках.

Satanas Nobiscum! 29-Aug-XXXVII A.S.


 
wicked   (2002-08-29 09:48) [7]

2 WhiteCat © и Digitman ©
замечу, что есть аналог yacc для паскаля... написан Albert Graef, последняя версия 4.1 от апреля 2000 года...
пакет называется TP Lex And Yacc и приходит с исходниками... также входит в поставку free pascal...
правда, есть отличия входного языка описаний от сишного оригинала...


 
Polevi   (2002-08-29 09:50) [8]

человеку васик был нужен а вы ему паскаль :-)


 
AFROLOV   (2002-08-29 09:59) [9]

Почитай эти ветки, может будет полезно.

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1030447406&n=0

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1030363496&n=0


 
Skier   (2002-08-29 12:06) [10]

>WhiteCat
и ещё сходи сюда, может найдёшь для себя
что-нибудь полезное
http://www.carlo-kok.com/


 
WhiteCat   (2002-08-29 19:47) [11]

Огромное спасибо!
Я и не знал, что мир так интересен :)
Начинаю разбираться .


 
Yaro   (2002-08-29 22:09) [12]

>WhiteCat - для паскаля IFPS ( http://www.carlo-kok.com) самый темный! Сам юзал когда-то...


 
VSergeySPB   (2002-08-30 23:05) [13]

У меня есть неплохой интепретатор для Дельфи. причем бесплатный и с исходниками. При этом он достаточно мощьный и имеет множество примеров. Пиши если надо..



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
1-35807
demisen
2002-08-30 11:32
2002.09.12
Main Form


1-35635
VSergeySPB
2002-08-30 22:59
2002.09.12
Inage и ListView


1-35669
Fox Mulder
2002-09-02 10:39
2002.09.12
Смена обоев Windows NT v4.0


14-35900
Ev_genus
2002-08-17 16:24
2002.09.12
Кто такой ламер?


3-35542
Aleksandr
2002-08-21 14:26
2002.09.12
Как индексы в ClientDataSet сделать по убыванию?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский