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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2011, 19:54   #1
Jeka57
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 15
По умолчанию Синтаксический анализатор

Здравствуйте! Нужна небольшая помощь с лабораторной по delphi, мне она никак не дается, не могу понять...
Задание звучит примерно так:
Цитата:
Разработать синтаксический анализатор для - Язык арифметических выражений в инфиксной форме с операциями сложения,
вычитания, умножения, деления без скобок, с операндами в форме
идентификаторов и целых констант и функциональных выражений с несколькими
аргументами. Аргумент функционального выражения – идентификатор.
Наброски программки есть. Но она неправильно работает. Исходники с компиленной прогой прикрепил.

Суть в том, что если вводить
Код:
 sin(x)+
или
Код:
sin(a,b
,то анализатор считает это корректным выражением, хотя должен ругаться.
Буду очень благодарен за помощь! Заранее спасибо!
Вложения
Тип файла: rar an.rar (179.6 Кб, 9 просмотров)

Последний раз редактировалось Jeka57; 05.06.2011 в 19:59.
Jeka57 вне форума Ответить с цитированием
Старый 05.06.2011, 22:47   #2
Jeka57
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 15
По умолчанию

Вот главная процедура разбора:
Код:
procedure TSyntaxAnalyzer.Parse;

CONST oper1=[PLUS, MINUS,ZP]; // операция1
      oper2=[MUL, DIVIDE]; // операция2
      item=[ID,NUMBER]; // слагаемое


VAR curlex:TRes;

PROCEDURE Term; FORWARD;

PROCEDURE Expr;

BEGIN
 Term;
 WHILE curlex.lexeme IN oper1 DO
  BEGIN
   curlex:=GetLex;
   term
  END
END;

PROCEDURE Factor;

BEGIN
 IF curlex.lexeme IN Item THEN
  BEGIN
   curlex:=GetLeX;
   Exit
  END;
 IF curlex.lexeme=LP THEN
  BEGIN
   curlex:=GetLeX;
   Expr;
   IF curlex.lexeme<>RP THEN
    BEGIN
     Ferr:='Непарные скобки';
     SELF.Ferrpos:=curlex.Position;
     Exit
    END
   ELSE
    curlex:=GetLex;
  END
 ELSE
    BEGIN
     Ferr:='Синтаксическая ошибка';
     SELF.Ferrpos:=curlex.Position;
     Exit
    END
END;

PROCEDURE Term;

BEGIN
 Factor;
 WHILE curlex.lexeme IN oper2 DO
  BEGIN
   curlex:=GetLex;
   Factor
  END
END;

BEGIN
 curlex:=GetLeX; // для запуска считываем первую лексему
 Expr;
 IF Ferr<>'' THEN
  SELF.Ferrpos:=curlex.Position
END;
Jeka57 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтаксический анализатор Ita Фриланс 0 29.03.2011 01:37
Синтаксический анализатор Douglas Помощь студентам 0 28.12.2010 18:01
Синтаксический анализатор Lifefine Общие вопросы Delphi 3 09.10.2010 19:42
Синтаксический анализатор delphin100 Общие вопросы Delphi 10 01.05.2010 12:50