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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2011, 15:04   #1
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию Синтаксический анализатор

По заданию мне необходимо разработать язык арифметических выражений в инфиксной форме с операциями сложения, вычитания, умножения, деления без скобок, с операндами в форме идентификаторов и элементов массива.
Я поняла как сделать все кроме элементов массива. Это должно быть что то вроде a+d*8-{s,e}. Но е не пойму как эти самые элементы вместе с фигурными скобками описать в программе. Может кто сможет мне подсказать?

Лексический анализатор
Код:
unit Lexx;

interface

uses SysUtils;

TYPE TLexemeType=(NUMBER, ID, PLUS, MINUS, del, umn, FINISH);

TYPE Tres=RECORD
                      lexeme:TLExemeType;
                      value: LONGINT;
                      name:STRING;
                      position:WORD
                    END;
     TResult=ARRAY OF TRes;

    TLexicalAnalyzer=CLASS
     PRIVATE
      Ferr:STRING;
      Flex:TResult;
      FUNCTION GetError:STRING;
      FUNCTION GetLex:TResult;
     PUBLIC
      CONSTRUCTOR Create;
      PROCEDURE Run(s:STRING);
      PROPERTY Error:STRING READ GetError;
      PROPERTY Lexem:TResult READ GetLex;
    END;
implementation



CONSTRUCTOR TLexicalAnalyzer.Create;
BEGIN
 INHERITED Create;
 FErr:=''; SetLength(Flex,0)
END;

{DESTRUCTOR TLexicalAnalyzer.Free;
BEGIN
 Finalize(Flex) // Удаление из памяти динамического массива
END;  }

FUNCTION TLexicalAnalyzer.GetError:STRING;

BEGIN
 Result:=Ferr
END;

FUNCTION TLexicalAnalyzer.GetLex:TResult;

BEGIN
 Result:=Flex
END;


PROCEDURE TLexicalAnalyzer.Run(s:STRING);

VAR i:WORD;

PROCEDURE addlex(l:TLexemeType; v:LONGINT; n:STRING);

BEGIN
 SetLength(FLex,Length(FLex)+1);
 WITH FLex[Length(FLex)-1] DO
  BEGIN
   Lexeme:=L;
   Value:=v;
   Name:=n;
   Position:=i
  END
END;

PROCEDURE ReadID;

VAR n:STRING;

BEGIN
 n:=s[i];
 INC(i);
 WHILE (i<=LENGTH(s)) AND (s[i] IN ['A'..'Z','_','a'..'z','0'..'9']) DO
  BEGIN
   n:=n+s[i];
   INC(i)
  END;
 AddLex(ID,0,n);
 DEC(i)
END;

PROCEDURE ReadNumber;

VAR n:STRING;
BEGIN
 n:=s[i];
 INC(i);
 WHILE (i<=LENGTH(s)) AND (s[i] IN ['0'..'9']) DO
  BEGIN
   n:=n+s[i];
   INC(i)
  END;
  AddLex(NUMBER,StrToInt(n),n);
  DEC(i)
END;

BEGIN
 i:=1;
 SetLength(Flex,0);
 Ferr:='';
 WHILE i<=LENGTH(s) DO
  BEGIN
   CASE s[i] OF
    '+': AddLex(PLUS,0,'+');
    '-': AddLex(MINUS,0,'-');
    '/': AddLex(del,0,'/');
    '*': Addlex(umn,0,'*');
    'A'..'Z','_','a'..'z': ReadID;
    '0'..'9': ReadNumber
   ELSE
    BEGIN
     Ferr:='Недопустимый символ';
     Exit
    END
   END;
   INC(i)
  END;
 AddLex(FINISH,0,'')
END;



end.
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 11.12.2011, 15:05   #2
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

Синтаксический анализатор
Код:
unit Synt;


interface

uses Lexx, Synt2;

 type TSyntaxAnalyzer2=CLASS(TSyntaxAnalyzer)
     PUBLIC
      PROCEDURE Parse;OVERRIDE;
     END;

implementation

PROCEDURE TSyntaxAnalyzer2.Parse;

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

      TYPE TState=(TSTART, TITEM, TOPER, TERROR);

VAR state:TState;
    curlex:TRes;

BEGIN
 state:=TSTART;
 REPEAT
   curlex:=GetLex;
   CASE state OF
   TSTART:
    IF curlex.lexeme IN oper1 THEN
     State:=TERROR
    ELSE
     IF curlex.lexeme IN item THEN
      State:=TITEM
     ELSE
      State:=TERROR;
   TITEM:
    IF curlex.Lexeme IN oper1 THEN
     state:=TOPER
    ELSE
     state:=TERROR;
   TOPER:
    IF curlex.Lexeme IN item THEN
     state:=TITEM
    ELSE
     state:=TERROR;
    END;
  UNTIL  (State=TERROR) OR (curlex.lexeme=FINISH);
 IF (curlex.lexeme<>FINISH) THEN
  BEGIN
   Ferr:='Синтаксическая ошибка';
   FErrPos:=curlex.position
  END
END;

end.
Главный unit
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,Synt,{Synt2,Synt3,}Lexx;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  LA:TLExicalAnalyzer;
  SA:TSyntaxAnalyzer2;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 LA:=TLExicalAnalyzer.Create; // создали лексический анализатор
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
LA.Free
end;

procedure TForm1.Button1Click(Sender: TObject);
var R:tresult; // список лексем
    mes:STRING;

begin
 SetLength(r,0);
 WITH LA DO
  BEGIN
   Run(Trim(edit1.Text)); // формирование списка лексем
   IF Error='' THEN
    begin
     r:=Lexem;
     SA:=TSyntaxAnalyzer2.Create(r); // создание СА
     SA.Parse; // разбор списка лексем
     IF SA.error='' THEN
      mes:='выражение корректное'
     ELSE
      BEGIN
       mes:=SA.error+' (поз. '+IntToStr(SA.errorpos)+')';
       WITH Edit1 DO
        BEGIN
         // выделение ошибки в поле ввода 
         SetFocus;
         IF SA.errorpos<Length(Edit1.Text) THEN
          SelStart:=SA.errorpos
         ELSE
          SelStart:=Length(Edit1.Text)-1;
         SelLength:=1
        END
      END;
     MessageDlg(mes,mtInformation,[mbOK],0);
     SA.Free
    END
   ELSE
     MessageDlg(error,mtInformation,[mbOK],0);
  END
end;


end.
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 12.12.2011, 09:51   #3
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

Вам так тяжело мне помочь?
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтаксический анализатор Jeka57 Помощь студентам 1 05.06.2011 22:47
Синтаксический анализатор 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