Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sileno De Oliveira Brito

Problemas com expressões regulares C e Flex

Recommended Posts

To com um grande problema que não sei como resolver, o que eu quero é que ao encontrar uma expressão regular o sistema passe os valores para

Vou citar um exemplo, a minha sintaxe pode estar completamente errada, por esse motivo vou escrever o que eu queria fazer

 

ao encontrar uma sequencia de alpha seguida por number e seguida por number

ou seja "teste 12 23"

passar os valores para função soma(teste, 12, 23)

que por sua vez escreveria em tela teste:: 35

e se não fosse pedir muito queria saber como armazenar o retorno da função. Essa função é meramente um exemplo.

Se possível explique a solução

 

 

%{
#include <stdio.h>
%}
number 		[0-9]+
alpha		[a-zA-Z0-9]+
%%

alpha\number\number	return soma(alpha, number, number);
%%

/*
* Isso é so um exemplo portanto a ideia principal é usar a função abaixo mesmo.
*/

int soma(char * texto, int a, int B){
int k;
	printf("%s:: %d", texto, (a+B));
	return 18;
}

PS: o exemplo acima é para ser compilado com o flex ou lex:: flex arquivo

compilar o arquivo gcc saida_do_lex.c -Wall -lfl -o test

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

scanf("%s%d%d", alpha, &number1, &number2);

??

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

A intenção não é essa até porque seria mais viável fazer um read do stdin o que eu quero é: A medida que o analisador léxico encontre uma expressão regular que eu tenha definido ele processe as e passse como parâmetro para a função. Eu até li o conteúdo Apostila sobre Lex e Yacc em Inglês, mas não consegui assimilar o como fazer isso funcionar. O que eu preciso é usar o lex não c puro, por c puro eu sei fazer, mas eu agradeço o esforço e a boa vontade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal essa apostila, nunca estudei essas coisas muito afundo..

a página 16, não te auxilia em nd?

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que sim, mas o problema é que não estou conseguindo me achar, isso ta pior do que grego, nunca vi isso antes. Se fosse grego dava para colocar no google translate, mas isso...

 

Acho que a solução para o meu problema está por aqui:

 

%token INTEGER
%%
program:
program expr '\n' { printf("%d\n", $2); }
|
;
/* Aqui ta ruim de entender tb.*/
expr:
INTEGER { $$ = $1; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
;
%%
int yyerror(char *s) {
fprintf(stderr, "%s\n", s);
return 0;
}
int main(void) {
yyparse();
return 0;
}
/* nao de onde vem isso se é constante ou sei la nem o que é $$ = $1 $3 pelo que parece o $1 é o primeiro elemento passado como argv[1] e argv[3] sei lá...*/
expr: expr '+' expr { $$ = $1 + $3; }

 

O que voce acha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

UFHDAU ta pior q grego.. esse programa ao meu ver está procurando algum sinal pra fazer o cálculo matemático..

e como você qr ler um alpha..

e se a gente tentar achar o primeiro espaço em branco?

da msm forma que no programa espera o '\n' ai??

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que isso faz é o seguinte ele le os tokens, que são baseados nas expressoes regulares que se cria. A minha intenção nao é fazer um calculo e fazer executar uma funcao com passagem de parametros o calculo foi um exemplo mais basico.

 

Isso é o principio para escrever uma linguagem como SQL / C ou qualquer outra. O espaço em branco não vai ter, pq depois que ele processa como ele processa tokens ele ja elimina as entradas em brancos pois isso e o que por default separa um token de outro. Acho que o mais interessante é tentar armazenar a saida dele vou escrever uma parada que funciona:

 

%{
#include <stdio.h>
#include <string.h>

#define SELECT  0
#define INSERT  1
#define DELETE  2
#define UPDATE  3

#define SAMBA   1
#define PPTP    2
#define CBQ     3

#define STOP    1
#define START   2

int square(int a);
%}


ACTION          select|insert|delete|update
SERVICE         data|value
DIGIT           [0-9]+
WORD            [a-zA-Z]+[a-zA-Z0-9]*
PATH            [a-zA-Z0-9]*


%%
{SERVICE}       printf("Este e o servico:: %s", yytext);
{ACTION}        printf("Esta e a acao:: %s", yytext);
{DIGIT}         square(atoi(yytext));
#quit           exit(0);

stop printf("token:: %s", yytext);

%%
int square(int a){
        printf("O quadrado do numero: %d\n\t%d", a, (a*a));
        return 0;
}

escrevi e compilei esse ta ok, mas nao me atende pq so tem uma variavel

 

se voce digitar um numero ele vai te dar o quadrado dele se escrever uma palavra reservada ele vai retornar uma mensagem tudo isso foi definido por token lembre que para compilar tem que usar aquele exemplo que eu citei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para chamar uma função arbitrária em run-time estude bibliotecas dinâmicas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para chamar uma função arbitrária em run-time estude bibliotecas dinâmicas.

 

Legal gostei da parada das bibliotecas dinamicas, nao conhecia a fundo e nao usava fiz uma rapida consulta ao Gugu e ele achei o seguinte topico Criar biblioteca dinamica, mas sinceramente acho que nao tem nada a ver com o problema, mas pode ser pq eu talves nao tenha entendido corretamente. Uma solução que eu conseguiria fazer o que eu quero seria armazenar os valores em variaveis globais e em estrutura de dados, mas creio que esse sistema de lex ja tenha uma pilha para armazenar esses dados que possam ser reaproveitadas assim como fazemos com recursividade. Aqui tem mais a ver com lex do que com c.

 

Você entendeu legal o que estamos discutindo aqui?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom material, eu já li, tive que me desligar desse conteúdo por um tempo, mas to de volta a esse topico, preciso achar uma solução e entender como esse bagulho funciona. Vou dar uma lida no decorrer da semana e ver se faço um post com alguma solução mesmo que seja parcial.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tranquilo, no que eu puder ajudar to aki ;D

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.