Консультация № 177836
13.04.2010, 15:01
0.00 руб.
0 12 1
Доброго времени суток
Ссылка на проект http://slil.ru/28949320 (400 Кбайт)
Возник небольшой вопрос:
Имеется программа, предназначенная для лексического разбора текста на JAVA скрипт , которая затем переводит его в выходной язык фортран.
Программа состоит из трех вкладок :
1-я вкладка Лексический анализатор- производит лексический разбор кода из открытого файла с расширением js,
2-я вкладка ОПЗ - отображает перевод разобанного текста в обратную польскую запись
3-я вкладка ЛР3 Отображает перевод в выходной язык фортран(код для этой вкладке находится в файле TranslateToC.inc )
---------------------------------------------------------------------------------------------------------------
Вопрос: необходимо чтобы при разборе любой программы в конец поля mC(MEMO) для 3-й вкладки ЛР3(код для этой вкладке находится в файле TranslateToC.inc )
в конце добавлялись две строки такие:

STOP
END
-------
пробовал просто дописывать перед последним end; в коде mC.Lines.Strings[i]:='STOP';
но при этом выводится не только в последней строке


Приложение:
//-------------------------------------
//Процедура Подготовки к преобразованию
procedure Tf.ts3Show(Sender: TObject);
begin
f.mInRPR.Lines:=f.mRPR.Lines;
f.mInRPR.Repaint;
f.btTranslateToC.Enabled:=true;
mC.Clear;

StackToC:=TStack.Create();

flagDescriptionArray:=false;
flagDescriptionVar:=false;
end;

//-------------------------------------
//Процедура Нажатия кнопки "Произвести разбор в Си"
procedure Tf.btTranslateToCClick(Sender: TObject);
var i, j : integer;
str : string;
lex : Str20;
z : integer;
begin
z:=0;
for i:=0 to (mInRPR.Lines.Count-1) do begin
str:='';
str:=mInRPR.Lines.Strings[i];
j:=1;
while j <= length(str) do begin
lex:=SubStr(j, str);
TranslateToC(lex,z);
end; //for j...
end; //for i...

StackToC.Free();
btTranslateToC.Enabled:=false;
end;

//-------------------------------------
//Функция Выборки номера лексемы
function Tf.ChooseNumberFromString(var lex: Str20): integer;
var len: integer;
s : str20;
i : integer;
begin
s:='';
len:=ord(lex[0]);
for i:=2 to len do begin
if(lex[i] = '_') then break;
s:=s + lex[i];
end;
ChooseNumberFromString:=StrToInt(s);
end;

//-------------------------------------
//Функция Выборки количества параметров лексемы
function Tf.ChooseNumberAfter(var lex: Str20): integer;
var len : integer;
s : str20;
i,ii : integer;
begin
s:='';
len:=ord(lex[0]);
i:=1;
while(lex[i]<>'_') do inc(i);
inc(i);
for ii:=i to len do s:=s + lex[ii];
ChooseNumberAfter:=StrToInt(s);
end;

//-------------------------------------
//Функция выборки лексемы без параметров
function Tf.ChooseNumberBefore(var lex: Str20): Str20;
var len : integer;
s : str20;
i : integer;
begin
s:='';
len:=ord(lex[0]);
i:=1;
while(lex[i]<>'_') do begin
s:=s + lex[i];
if (i=len) then break;
inc(i);
end;
ChooseNumberBefore:=s;
end;

//-------------------------------------
//Функция поиска лексемы в файла
function Tf.SearchInFile(ch: char; number: integer): Str20;
var List : TStrings;
s : Str20;
begin
List:=TStringList.Create();
case ch of
'I': List.LoadFromFile('lexems/Ident.lexAn');
'N': List.LoadFromFile('lexems/Cnumber.lexAn');
'C': List.LoadFromFile('lexems/Cstring.lexAn');
end;
s:=List.Strings[number];
List.free;
SearchInFile:=s;
end;

//-------------------------------------
//Процедура, производящая разбор в Фортран
procedure Tf.TranslateToC(var lex: Str20; var i: integer);
var number, ii : integer;
_lex : Str20;
temp_str : Str20;
begin
_lex:=ChooseNumberBefore(lex);
case(lex[1]) of
'V': flagDescriptionVar:=true;
'N': StackToC.Push(SearchInFile('N', ChooseNumberFromString(lex)), 100, 0, -1);
'C': begin
temp_str:='"'+SearchInFile('C', ChooseNumberFromString(lex))+'\0"';
StackToC.Push(temp_str, 100, 0, -1);
end;
'I': StackToC.Push(SearchInFile('I', ChooseNumberFromString(lex)), 100, 0, -1);
'B': begin //начало блока "{"
{mC.Lines.Strings[i]:=mC.Lines.Strings[i] + '{';
mC.Lines.Add('');
inc(i); }
end;

'E': begin //конец блока "{"
//mC.Lines.Strings[i]:=mC.Lines.Strings[i] + '}';
// mC.Lines.Add('');
// inc(i);
end;

'F': begin
number:=ChooseNumberAfter(lex);
temp_str:=')';
for ii:=1 to number-1 do begin
if (ii<>1) then temp_str:=StackToC.pop()+', '+temp_str
else temp_str:=StackToC.pop()+temp_str;
end;
temp_str:=StackToC.pop()+'(' + temp_str;
StackToC.Push(temp_str, 100, 0, -1);
end;

'A': begin //обработка переменных с индексами(массивы и элементы массивов)
number:=ChooseNumberAfter(lex);
for ii:=1 to number-1 do begin
if (ii<>1) then temp_str:=StackToC.pop()+' ][ '+temp_str //скобки для разделения элементов
else temp_str:=StackToC.pop()+']';
end;
temp_str:=StackToC.pop()+'[' + temp_str;
StackToC.Push(temp_str, 100, 0, -1);
end;

'W': begin
if (_lex = 'W10') then begin //если If выводим также как и ява скрипт
mC.Lines.Strings[i]:='if '+StackToC.pop();
mC.Lines.Add('');
inc(i);
end else

if (_lex = 'W8') then begin //function 0
number:=ChooseNumberAfter(lex);
for ii:=1 to number-1 do begin
if (ii<>1) then mC.Lines.Strings[i]:='int '+StackToC.pop()+', '+mC.Lines.Strings[i]
else mC.Lines.Strings[i]:='int '+StackToC.pop();
end;
mC.Lines.Strings[i]:='int Function '+StackToC.pop()+' Parameter ' + mC.Lines.Strings[i];
mC.Lines.Add('');
inc(i);
end else
//добавить типы данных
if (_lex = 'W13') or (_lex = 'W3') then begin //var или const 0
flagDescriptionVar:=false;
number:=ChooseNumberAfter(lex);
for ii:=1 to number do begin
if (ii<>1) then mC.Lines.Strings[i]:=StackToC.pop()+', '+mC.Lines.Strings[i]
else mC.Lines.Strings[i]:=StackToC.pop();// ; -не нужна
end;
mC.Lines.Strings[i]:='integer ' + mC.Lines.Strings[i];
mC.Lines.Add('');
inc(i);
end else

//-----------------------------------------------
if (_lex = 'W4') then begin //else 1(не используем в фортране отсутствует)
{mC.Lines.Strings[i]:='else ';
mC.Lines.Add('');
inc(i);}
end else
//----------------------------------------------
if (lex = 'W9') then begin //goto 2
mC.Lines.Strings[i]:=mC.Lines.Strings[i]+'GO TO '+StackToC.pop();
mC.Lines.Add('');
inc(i);
end else

if (lex = 'W12') then begin //return 2
mC.Lines.Strings[i]:=mC.Lines.Strings[i]+'return #13 end'+StackToC.pop();
mC.Lines.Add('');
inc(i);
end else
//-----------------------------------------------
if (lex = 'W15') then begin //array 0 (описание массива)
flagDescriptionArray:=true;
temp_str:='DIMENSION ';
temp_str:='('+StackToC.pop()+')';
temp_str:=StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else

if (lex = 'W5') then begin
StackToC.Push('(false)', 100, 0, -1);
end else
if (lex = 'W7') then begin
StackToC.Push('(true)', 100, 0, -1);
end;
end; //'W'
//-------------------------------
'R': begin
if (lex = 'R7') then begin //: 6
mC.Lines.Strings[i]:=mC.Lines.Strings[i]+StackToC.pop()+': ';
mC.Lines.Add('');
inc(i);
end;
end; //'R'
//-------------------------------
'O': begin
if (lex = 'O7') then begin // = 2 оператор присваивания
if (not flagDescriptionArray) then begin
temp_str:='';
temp_str:=' = '+StackToC.pop()+temp_str;
temp_str:=StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
if (not flagDescriptionVar) then begin
mC.Lines.Strings[i]:=StackToC.pop();
mC.Lines.Add('');
inc(i);
end;
end else
flagDescriptionArray:=false;
end else

if (lex = 'O5') then begin //сравнение <
temp_str:='';
temp_str:=' .LT. '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else
if (lex = 'O6') then begin //сравнение>
temp_str:='';
temp_str:=' .GE. '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else
if (lex = 'O8') then begin //сравнение !=
temp_str:='';
temp_str:=' .NE. '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else
if (lex = 'O9') then begin //сравнение <=
temp_str:='';
temp_str:=' .LE. '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else
if (lex = 'O10') then begin //сравнение >=
temp_str:='';
temp_str:=' .GE. '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else
if (lex = 'O11') then begin //==
temp_str:='';
temp_str:=' .EQ. '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else

if (lex = 'O0') then begin //+
temp_str:='';
temp_str:=' + '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else
if (lex = 'O1') then begin //-
temp_str:='';
temp_str:=' - '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else

if (lex = 'O2') then begin //*
temp_str:='';
temp_str:=' * '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else
if (lex = 'O3') then begin // /
temp_str:='';
temp_str:=' / '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end else
if (lex = 'O4') then begin //%
temp_str:='';
temp_str:=' % '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end;
end; //'O'
end; //case ...

end;

Обсуждение

Неизвестный
14.04.2010, 08:45
общий
Что ни у кого нет предположений как вывести две строки в поле MEMO?
Неизвестный
14.04.2010, 08:56
общий
Иванов Руслан Иванович:
А в какой процедуре это делается?
Неизвестный
14.04.2010, 09:07
общий
Владимир Лазурко
Сам разбор лексем и вывод в поле MEMO осуществляется в этой процедуре
-----------------------------------------------------
//Процедура, производящая разбор в Фортран
procedure Tf.TranslateToC(var lex: Str20; var i: integer);
var number, ii,coun : integer;
_lex : Str20;
temp_str : Str20;
-----------------------------------
Дописал так в коде
Код:
if (Stack.Empty()) then     begin
mC.Lines.Strings[i]:='STOP ';


Результат такой же при разборе файла PRIMER1.js,который есть в прикрепленном архиве выводится вот так (STOP вывелось не только в последней строке)

Код:
int Function getMonthName Parameter int  month, int nameMonth
integer a, b
a = .123E-23
STOP GO TO mmm
STOP mmm:
a = b
if a((b .GE. 5), (i + 8))
a = b
if (a .LE. b)
a = ((3 + (898.9 * (t[6] + 7))) - (7.5e+9 + e90))
STOP
давно
Профессионал
153662
1070
14.04.2010, 09:17
общий
Иванов Руслан Иванович:
А Вы не пробовали просто делать: mC.Lines.Add('STOP'); mC.Lines.Add('END'), при этом идёт добавление строк в конец memo. Естественно это надо делать в конце процедуры и не в теле цикла. Вставить эти строки нужно перед end, которая закрывает процедуру нажатия кнопки "Произвести разбор в Фортран". Напишите в какой версии дэлфи Вы писали проект.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
14.04.2010, 09:36
общий
Евгений/Genia007/
Проект был сделан в Borland Delphi V 7.0(Build 4.453,
код находится в файлах с расширением inc---(подключение этих файлов описано в MainUnit.pas:
Код:
implementation

{$I LexicalAnalizator_Variables.inc}
{$I LexicalAnalizator.inc}
{$I OPZ_Variables.inc}
{$I OPZ.inc}
{$I TranslateToC_variables.inc}
{$I TranslateToC.inc}

Добавил mC.Lines.Add('STOP'); после цикла case в процедуре procedure Tf.TranslateToC(var lex: Str20; var i: integer);
результат такой:

Код:
int Function getMonthName Parameter int  month, int nameMonth
integer a, b
a = .123E-23
GO TO mmm
STOPmmm:
a = b
if a((b .GE. 5), (i + 8))
a = b
if (a .LE. b)
a = ((3 + (898.9 * (t[6] + 7))) - (7.5e+9 + e90))
STOP
STOP

STOP
STOP

STOP
STOP

STOP
STOP
STOP


Неизвестный
14.04.2010, 09:38
общий
Иванов Руслан Иванович:
Так работает?

Код:
procedure Tf.TranslateToC(var lex: Str20; var i: integer);
var number, ii : integer;
_lex : Str20;
temp_str : Str20;
begin


.....


if (lex = 'O4') then begin //%
temp_str:='';
temp_str:=' % '+StackToC.pop()+')'+temp_str;
temp_str:='('+StackToC.pop()+temp_str;
StackToC.push(temp_str, 100, 0, -1);
end;
end; //'O'
end; //case ...

mC.Lines.Add('STOP');
mC.Lines.Add('END');

end;
Неизвестный
14.04.2010, 09:43
общий
Владимир Лазурко
Результат
Код:
int Function getMonthName Parameter int  month, int nameMonth
integer a, b
a = .123E-23
ENDGO TO mmm
STOPmmm:
a = b
if a((b .GE. 5), (i + 8))
a = b
if (a .LE. b)
a = ((3 + (898.9 * (t[6] + 7))) - (7.5e+9 + e90))
END
STOP
END
STOP
END

STOP
END
STOP
END
STOP
END

STOP
END
STOP
END
Неизвестный
14.04.2010, 09:54
общий
Иванов Руслан Иванович:
Где-то ведь происходит последняя запись?
Например, когда парсер доходит до конца программы?
Неизвестный
14.04.2010, 10:07
общий
Владимир Лазурко
C этим не разобрался где проиcходит последняя запись , так программу писал не я
давно
Профессионал
153662
1070
14.04.2010, 11:29
общий
Иванов Руслан Иванович:
Вот где надо вставить:
Код:
//Процедура Нажатия кнопки "Произвести разбор в Си"
procedure Tf.btTranslateToCClick(Sender: TObject);
var i, j : integer;
str : string;
lex : Str20;
z : integer;
begin
z:=0;
for i:=0 to (mInRPR.Lines.Count-1) do begin
str:='';
str:=mInRPR.Lines.Strings[i];
j:=1;
while j <= length(str) do begin
lex:=SubStr(j, str);
TranslateToC(lex,z);
end; //for j...
end; //for i...

StackToC.Free();
btTranslateToC.Enabled:=false;
mC.Lines.Add('STOP');
mC.Lines.Add('END');

end;
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
14.04.2010, 11:31
общий
Результат работы:
Код:
int Function getMonthName Parameter int  month, int nameMonth
integer a, b
a = .123E-23
GO TO mmm
mmm:
a = b
if a((b .GE. 5), (i + 8))
a = b
if (a .LE. b)
a = ((3 + (898.9 * (t[6] + 7))) - (7.5e+9 + e90))
STOP
END
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
14.04.2010, 19:53
общий
это ответ
Здравствуйте, Иванов Руслан Иванович.
Для этого надо в в файле TranslateToC.inc добавить в процедуру нажатия кнопки "Произвести разбор в Си" две строки:
mC.Lines.Add('STOP');
mC.Lines.Add('END');
Код:
//Процедура Нажатия кнопки "Произвести разбор в Си"
procedure Tf.btTranslateToCClick(Sender: TObject);
var i, j : integer;
str : string;
lex : Str20;
z : integer;
begin
z:=0;
for i:=0 to (mInRPR.Lines.Count-1) do begin
str:='';
str:=mInRPR.Lines.Strings[i];
j:=1;
while j <= length(str) do begin
lex:=SubStr(j, str);
TranslateToC(lex,z);
end; //for j...
end; //for i...

StackToC.Free();
btTranslateToC.Enabled:=false;
mC.Lines.Add('STOP');
mC.Lines.Add('END');

end;
Проект
5
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа