GARANTIR DESCONTO

Fórum Analisador Lexico #280965

10/05/2005

0

Galera,

Estou fazendo um analisador léxico onde quero grava no memo o armazenamento de caracteres existente dentro de um stringlist. sendo que no memo deverá aparecer assim

Sendo que na validadação sendo Letra seguido de digito [0..9], sera dado a string como identificador pela grámatica fornecida pelo professor. E no caso do usuário digitar 2 vezes digito [0..9] dai irei destroir o stringlist e cria-lo novamente quando uma letra de [a..z] or [A..D] or [F..Z] for digitada, pois E significa elevado na gramática.

Por exemplo se o usuario digitar primeiro A dai sera impresso no memo

identificador -> A

se na sequencia vier b dai ter que vir

identificador -> Ab

se na sequencia vier 2 dai ter que vir

identificador -> Ab2

se na sequencia vier 2 dai:

tera que ser destruido o stringlist que armazena a sequencia de caracteres.

Alguem pode me ajudar.

identificador -> idade


[b:9fb0bd62f5]veja a função que fiz abaixo:[/b:9fb0bd62f5]

function TFrmCompilador.valida_Caract_retorna_simbolo(s: char): boolean;
var i : integer;
impressao : string;
Controla_impressao: boolean;
begin
controla_impressao := False;
if not Assigned(Identificador_list) Then
Identificador_List := TStringList.Create;
result := False;
case s of
´0´..´9´:begin
if (caracter_ant in[´a´..´z´])or
(caracter_ant in[´A´..´D´])or
(caracter_ant in[´F´..´Z´])Then
begin
Identificador_List.Add(s);
Memo2.Lines.Add(´IDENTIFICADOR -> ´);
for i:= 0 to Identificador_List.Count - 1 do
begin
Memo2.Lines.Append(Identificador_List[i]);
Controla_impressao := True; // variavel indica que ja imprimir resultado no memo
end
end
else
begin
if (caracter_ant = ´+´) or ((caracter_ant) = ´-´) Then
impressao := ´CONSTANTE -> ´+ caracter_ant + s
else
impressao := ´CONSTANTE -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
end;
result := true;
end;
´A´..´D´:begin
Identificador_List.Add(s);
Memo2.Lines.Add(´IDENTIFICADOR -> ´);
for i:= 0 to Identificador_List.Count - 1 do
begin
Memo2.Lines.Append(Identificador_List[i]);
Controla_impressao := True;
end;
result := true;
end;
´F´..´Z´:begin
Identificador_List.Add(s);
Memo2.Lines.Add(´IDENTIFICADOR -> ´);
for i:= 0 to Identificador_List.Count - 1 do
begin
Memo2.Lines.Append(Identificador_List[i]);
Controla_impressao := True;
end;
result := true;
end;
´a´..´z´:begin
Identificador_List.Add(s);
Memo2.Lines.Add(´IDENTIFICADOR -> ´);
for i:= 0 to Identificador_List.Count - 1 do
begin
Memo2.Lines.Append(Identificador_List[i]);
Controla_impressao := True;
end;
result := true;
end;
´-´ :begin
impressao :=´ADDOP -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
result := true;
end;
´+´ :begin
impressao :=´ADDOP -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
result := true;
end;
´/´ :begin
impressao :=´MULOP -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
result := true;
end;
´*´ :begin
impressao :=´MULOP -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
result := true;
end;
´=´ :begin
impressao :=´RELOP -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
result := true;
end;
´>´ :begin
impressao :=´RELOP -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
result := true;
end;
´<´ :begin
impressao :=´RELOP -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
result := true;
end;
´E´ :begin
impressao :=´ID -> ´ + s;
Identificador_List.Free; // destroy lista de identificadores
result := true;
end;
´.´ :begin
if (caracter_ant in[´0´..´9´])Then
begin
impressao :=´CONSTANTE -> ´ + caracter_ant + s;
result := True
end
else
result := False;
Identificador_List.Free; // destroy lista de identificadores
end;
end;
// validacao c/ concatenacao
if (aux_caract in[´0´..´9´])and((caracter_ant + s) = ´or´) Then
begin
impressao := ´ADDOP -> ´ + caracter_ant + s;
result := true;
end
else
if (((aux_caract + caracter_ant + s)= ´div´) or
((aux_caract + caracter_ant + s)= ´mod´) or
((aux_caract + caracter_ant + s)= ´and´)) Then
begin
impressao := ´MULOP -> ´ + aux_caract + caracter_ant + s;
result := true
end
else
if(caracter_ant + s = ´>=´)or
(caracter_ant + s = ´<=´)or
(caracter_ant + s = ´<>´)Then
begin
impressao := ´RELOP -> ´ + caracter_ant + s;
result := true
end;
// armazena caracteres e posicoes anteriores e atuais
aux_caract := caracter_ant;
caracter_ant := s;
if not(Controla_impressao) Then
Memo2.Lines.Add(pchar(impressao));
end;

CHAMADA:

procedure TFrmCompilador.RichEdit1KeyPress(Sender: TObject; var Key: Char);
begin
// trata entrada do usuário com espaco em branco, tab, esc
if (word(key) = vk_Back) Then
begin
linha_coluna;
if (Label5.Caption = ´1´)and(Label6.Caption = ´0´) Then
Memo1.Clear;
end; // fecha if
if (word(key) <> vk_tab) and
(word(key) <> vk_return) and
(word(key) <> vk_Space) and
(word(key) <> vk_Back) and
(word(key) <> vk_escape) Then
begin
with RichEdit1 do
begin
linha_coluna;
// retorna estilo default
SelAttributes.Style :=[];
SelAttributes.Color := clBlack;
SelAttributes.Size := 8;
if not(valida_Caract_retorna_simbolo(key)) Then
begin
Panel2.Visible := True;
// with richedit
SelAttributes.Style :=[fsbold];
SelAttributes.Color := clRed;
SelAttributes.Size := 10;
Memo1.Lines.Add(´[Erro Léxico (´+IntToStr(lin)+´,´+IntToStr(col)+´)] -> ´+ (key) + ´ não é um caracter válido.´+ #13);
end; // fecha if 2
end; // fecha with
end;
end;


Jonasaf

Jonasaf

Responder

Posts

10/05/2005

Xtavinho

ola

bom, a funcao exata teria q dar uma analisada...
mas pra te ajudar, vc ja viu a ferramenta gals?

vc pode usa-la para gerar o codigo para vc, fazendo os seus identificadores e a sua gramatica...

se vc preferir, pode gerar um codigo pra ter uma ideia de como ele faz a implementacao, e bem interessante...

www.sourceforge.com - gals

Gustavo


Responder

Gostei + 0

10/05/2005

Jonasaf

ola bom, a funcao exata teria q dar uma analisada... mas pra te ajudar, vc ja viu a ferramenta gals? vc pode usa-la para gerar o codigo para vc, fazendo os seus identificadores e a sua gramatica... se vc preferir, pode gerar um codigo pra ter uma ideia de como ele faz a implementacao, e bem interessante... www.sourceforge.com - gals Gustavo


Valeu cara so q isso é um trabalho de faculdade...

O que quero mesmo é armazena a sequencia de caracteres formando uma string atraves da regra que citei acima por exemplo:
a gravação esta sendo feita no memo. Isso é o analisador léxico agora tenho que implementar o semantico.

Antes digitado:

entrada: i
IDENTIFICADOR -> i

entrada: j
IDENTIFICADOR -> ij

entrada: 2
IDENTIFICADOR -> ij2

entrada: 2

deleta stringlist
stringlist.free;


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar