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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2011, 01:28   #1
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию Язык арифметических выражений

Синтаксический анализатор
Задание:
Язык арифметических выражений в инфиксной форме с операциями сложения, вычитания, умножения, деления без скобок, с операндами в форме идентификаторов и целых констант и функциональных выражений с нескольким аргументами. Аргумент функционального выражения – идентификатор.

Вопрос:
как задать функциональное выражение с нескольким аргументами. Аргумент функционального выражения – идентификатор.
пример:abc(a,v)
Это сделал по методичке, а вод как идентификатор завязать с функцией не соображу. Всем спасибо.
Код:
procedure TLexicalAnalyzer.ExtractLexeme(const S:string;var P:Integer);

// лексемы в один символ

const ids:array[1..4] of TLexemeType=
                  ( ltPlus,ltMinus,
                  ltMultiply,ltDivide);

      idnames:array[1..4] of char=
      ('+','-','*','/');

var i:byte; found:boolean;

begin
  if P>Length(S) then
   Exit;
  found:=false;
  // текущий символ - это лексема в один символ?
  for i:=1 to 4 do
   if s[p]=idnames[i] then
    begin
     found:=true;
     PutLexeme(ids[i],P,'');
     inc(p)
    end;
  if not(found) then
   case S[P] of
   '0'..'9':
    // это число?
    Number(S,P);

   'A'..'Z','a'..'z':
    // идентификатор?
    Word(S,P);
   else
     // ошибка - недопустимый символ
    err:=WRONG_CHAR
  end
 end;



procedure TLexicalAnalyzer.Number
(const S:string;var P:Integer);
var InitPos:Integer; 

// проверка - является ли Ch цифрой
function IsDigit(Ch:Char):Boolean;
   begin
    Result:=Ch in ['0'..'9']
   end;

   begin
    InitPos:=P;
    // цикл, пока цифры не кончатся
    repeat
     Inc(P)
    until (P>Length(S)) or not IsDigit(S[P]);     
   PutLexeme(ltInteg,InitPos,Copy(S,InitPos,P-InitPos))
   end;


 procedure TLexicalAnalyzer.Word
(const S:string;var P:Integer);

var InitPos:Integer;
    ID:string;
      found:boolean;

  begin
   found:=false;
   InitPos:=P;
   Inc(P);
   while (P<=Length(S)) and
   (S[P] in ['0'..'9','A'..'Z','a'..'z']) do
    Inc(P);
   ID:=Copy(S,InitPos,P-InitPos);
     if not(found) then
    PutLexeme(ltId,InitPos,ID)
  end;
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!

Последний раз редактировалось serj-07; 09.03.2011 в 17:49.
serj-07 вне форума Ответить с цитированием
Старый 05.06.2011, 20:02   #2
Jeka57
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 15
По умолчанию

Попалась точно такая же задача, поделитесь решением, пожалуйста, если есть...
Jeka57 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибки в коде вычисления арифметических выражений на с++ Euforia_PZAS09_1 Помощь студентам 5 11.03.2010 20:42
вычисление арифметических выражений на с++ Euforia_PZAS09_1 Помощь студентам 1 09.03.2010 17:40
Вычисление арифметических выражений.(delphi) КуДрЯ Помощь студентам 3 02.04.2009 02:54
Трансляция арифметических выражений StakanpORTvejna Microsoft Office Excel 2 12.03.2009 05:57
обработка арифметических выражений (assembler) designer Помощь студентам 8 02.12.2008 21:16