Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2009, 14:42   #1
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию [Turbo Prolog] Анализатор текста на языке Pascal

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

1. раздел переменных
2. описание функций
3. while do
4. if then
АНАЛИЗАТОР НЕ УНИВЕРСАЛЬНЫЙ. ДОЛЖЕН ОТРАБАТЫВАТЬ С 3-4 ПЕРЕМЕННЫМИ НУ И БАЗОВЫЕ СИМВОЛЫ ОПРЕДЕЛЯТЬ ТИПА (+-*/)

Это нужно сделать не используя грамматику.
Подскажите как сделать?
Просто помогите идеей или на примере описания переменных как происходит анализ. Мне бы понять как это делается и я продолжу...
Как я делал, так у меня получается большая вложенность предикатов друг в друга....
Может кто мне на мои ошибки укажет и скажет как лучше сделать.

Этот исходник допускает все символы допустимые в разделе описания переменных, но не следит за их порядком. Поэтому варианты:

1) a,b:integer;
2) integer:,b,a:
будут считаться верными...

Использую Turbo Prolog 2

Код:
domains
  file=file_in
  list=string*
  str=string
  leks=string
  
predicates
  start
  readlist(list)
  leksfind(str)
  member(str,str)/*bazovoe slovo, ostatok stroki*/
  var(str,str)/*ostatok stroki, bazovoe slovo, tekushaya leksema*/
  
clauses

var(Y,VX) if VX="a",fronttoken(Y,VXX,YY),write(VX),
    member("var",YY).
var(Y,VX) if VX="b",fronttoken(Y,VX,YY),write(VX),
     member("var",YY).
var(Y,VX) if VX="c",fronttoken(Y,VX,YY),write(VX),
     member("var",YY).
var(Y,VX) if VX=";",fronttoken(Y,VX,YY),write(VX),
    nl,fail.
var(Y,VX) if VX=":",fronttoken(Y,VX,YY),write(VX),
     member("var",YY).
var(Y,VX) if VX=",",fronttoken(Y,VX,YY),write(VX),
    member("var",YY).
var(Y,VX) if VX="integer",fronttoken(Y,VX,YY),write(VX),
     member("var",YY).
var(Y,VX) if VX="boolean",fronttoken(Y,VX,YY),write(VX),
     member("var",YY).



/* raspoznaem bazovie slova dlya dalneishih instrukcii*/
member(X,Y) if X="program",!.

member(X,Y) if X="var",fronttoken(Y,VX,VY),
    var(Y,VX).

member(X,Y) if X="begin",write(X),nl.

member(X,Y) if X="end;",write(X),nl.

member(X,Y) if X="end.",write(X),nl.

member(X,Y) if write("Ne popal"),nl.

leksfind(Head) if 
     fronttoken(Head,X,Y),write(X),nl,
     member(X,Y).

leksfind("") if write("empty"),nl.
  
  readlist([Head|Tail]) if 
     not(eof(file_in)),readln(Head),write(Head),nl,
     leksfind(Head),readlist(Tail).
  
  readlist([]) if write("!!! FINISH !!!"),!.
  start if
    PAS_IN="PAS_IN.txt",
    openread(file_in,PAS_IN),
    readdevice(file_in),readlist(List),
    closefile(file_in).
goal
  start.

Последний раз редактировалось Arkuz; 03.05.2009 в 14:45.
Arkuz вне форума Ответить с цитированием
Старый 04.05.2009, 20:41   #2
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Никто в этом не шарит?
Arkuz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли на Turbo C++ писать в коде на русском языке? bull Общие вопросы C/C++ 3 11.06.2009 16:57
Удалить вершину с указанной меткой. Задача Turbo Prolog. Iridda Помощь студентам 1 24.01.2009 19:33
Программирование на алгоритмическом языке Turbo Pascal Дима82 Помощь студентам 28 10.05.2008 10:19