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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2011, 19:33   #1
deathz0r
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 24
По умолчанию Создание компилятора

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

Код:
Вот пример задания:
var 
a,b:integer;
c:integer;
begin
a:=3;
b:=a; 
if (a>b) and (b>0) then
c:=a
else begin
c:=b;
b:=1;
end;
end.
Код:
пример моего кода:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    StringGrid1: TStringGrid;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
  N=1;

var
  Form1: TForm1;
  k,poz:integer;
  copym,lexems:array[1..100]of string;
  stroka,temp:array[0..12]of string;
  dlina:array[0..12]of integer;

implementation

{$R *.dfm}

procedure probel;
var
Memo1: TMemo;
StringGrid1: TStringGrid;
i:integer;
begin
k:=0;
for i:=0 to 12 do
 begin
 stroka[i]:=Memo1.Lines[i];
 dlina[i]:=length(stroka[i]);
 stringgrid1.cells[0,0]:=inttostr(dlina[i]);
 poz:=pos(' ',stroka[i]);
 if poz>0 then
  begin
  inc(k);
  copym[k]:=copy(stroka[i],0,poz);
  delete(stroka[i],0,poz+1);
  lexems[k]:='_';
  stringgrid1.cells[0,1]:=copym[k];
  stringgrid1.cells[0,2]:=lexems[k];
  end;
 end;
end;



procedure TForm1.Button2Click(Sender: TObject);
var
f:textfile;
sp:string;
i:integer;
begin
Memo1.Lines.clear;
OpenDialog1.Execute;
assignfile(f,OpenDialog1.FileName);
reset(f);
for i:=1 to 13 do
 begin
  readln(f,sp);
  Memo1.Lines.Add(sp);
 end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
probel;
end;

end.
deathz0r вне форума Ответить с цитированием
Старый 17.10.2011, 20:11   #2
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

в какой момент возникает ошибка?
вашу процедуру наверно лучше изменить так:
внести ее в private-секцию формы, добавить TForm1. перед именем процедуры, удалить из var определение memo и stringgrid-a

ну а открытие файла я бы сделал так:
Код:
  if OpenDialog1.Execute then
  begin
    Memo1.Lines.clear;
    memo1.Lines.LoadFromFile(OpenDialog1.FileName);
    stringgrid1.RowCount:=memo1.Lines.Count;
  end;

Последний раз редактировалось Dush; 17.10.2011 в 20:14.
Dush вне форума Ответить с цитированием
Старый 17.10.2011, 20:42   #3
deathz0r
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 24
По умолчанию

компилируется нормально, но при нажатии на Button1 возникает ошибка в строке: stroka[i]:=Memo1.Lines[i]
deathz0r вне форума Ответить с цитированием
Старый 17.10.2011, 21:25   #4
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

если воспользуетесь моим советом - ошибка пропадет (проверил на себе) а дальше разбор строк. пробелы у вас только в двух строках поэтому не ориентируйтесь только на них
Dush вне форума Ответить с цитированием
Старый 18.10.2011, 12:56   #5
deathz0r
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 24
По умолчанию

спасибо за помощь, далее планируется ввести в поиск другие разделители.
deathz0r вне форума Ответить с цитированием
Старый 18.10.2011, 15:43   #6
deathz0r
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 24
По умолчанию

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

Код:
procedure TForm1.probel;
var
i:integer;
begin
k:=0;
for i:=0 to 12 do
 begin
 stroka[i]:=Memo1.Lines[i];
 dlina[i]:=length(stroka[i]);
 stringgrid1.cells[0,i]:=inttostr(dlina[i]);
 poz:=pos(' ',stroka[i]);
 if poz>0 then
  repeat
  inc(k);
  copym[k]:=copy(stroka[i],1,poz);
  delete(stroka[i],1,poz);
  stringgrid1.cells[2,i]:=stroka[i];
  stringgrid1.cells[1,k-1]:=copym[k];
  stringgrid1.Cells[1,k]:='_';
  until poz<0;

 end;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Memo1.Lines.clear;
    memo1.Lines.LoadFromFile(OpenDialog1.FileName);
    stringgrid1.RowCount:=memo1.Lines.Count;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
probel;
end;

end.

Последний раз редактировалось deathz0r; 18.10.2011 в 16:12.
deathz0r вне форума Ответить с цитированием
Старый 19.10.2011, 12:33   #7
deathz0r
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 24
По умолчанию

up topic^ .
deathz0r вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание компилятора Crivel Софт 7 23.01.2010 18:29
Смена Компилятора olesja Общие вопросы C/C++ 1 21.02.2009 10:53
директивы компилятора delphin100 Общие вопросы Delphi 4 07.10.2008 12:35
Создание своего собственого компилятора xGroupers Общие вопросы Delphi 3 06.05.2008 23:41