estou a fazer um trabalho para a universidade em C em que preciso de ler de um ficheiro um conjunto de regras que vão ser usadas para controlar o decorrer do programa (simular o crescimento de uma cidade)
não posso assumir que o ficheiro está escrito correctamente, ou seja, tenho que detectar erros de sintaxe nas regras.
o problema para já esta em validar as condições que são do género destas:
já consegui ler o ficheiro de forma a ler uma unica condição para uma string, para a tratar individualmente, mas não estou a conseguir validá-la para verificar se esta bem escrita. o problema está naquele pipe ( | ) como na primeira condição, que significa "se s for igual a F ou P..."
fiz esta expressão para tentar validar com regex,usando o regex.h
onde RCEAFG são os unicos caracteres que são validos nas condiçoes. este regex serve apenas para as condições que começam por "s=" pois as outras sao tratadas em separado.
o problema é que já testei esta expressão em vários sites que encontrei e parece estar a funcionar bem, mas no programa em C não funciona.
obrigado a quem me puder ajudar.
já agora, caso não tenha explicado bem, aqui estão alguns exemplos de expressões que o regex deve validar
e as que nao pode validar
EDIT: tinha-me esquecido. aqui está a funçao que uso para executar o regex. praticamente copiada de um exemplo que encontrei, pois ainda não estudei isto muito a fundo
não posso assumir que o ficheiro está escrito correctamente, ou seja, tenho que detectar erros de sintaxe nas regras.
o problema para já esta em validar as condições que são do género destas:
Código:
s = F | P
C>= 2
C < 5
s = F|P
R>=2
R < 5
fiz esta expressão para tentar validar com regex,usando o regex.h
Código:
^s=[RCEAFG]([|][RCEAFG])*$
o problema é que já testei esta expressão em vários sites que encontrei e parece estar a funcionar bem, mas no programa em C não funciona.
obrigado a quem me puder ajudar.
já agora, caso não tenha explicado bem, aqui estão alguns exemplos de expressões que o regex deve validar
Código:
s=E
s=E|A
s=E|E|G
Código:
s=
s=|
s=EA
s=E||A
Código:
int regexMatch(const char *string, char *regexPattern) {
int status;
regex_t re;
if (regcomp(&re, regexPattern, REG_NOSUB) != 0) {
return 0;
}
status = regexec(&re, string, (size_t) 0, NULL, 0);
regfree(&re);
if (status != 0) {
return 0;
}
return 1;
}
Última edição: