program lenguajeFormal integer,parameter :: n = 4, m = 3, tamanoCadena = 6 character,dimension(n,m) :: reglas character,dimension(tamanoCadena) :: cadena character :: extremoIzq, extremoDcho integer :: regla,pertence cadena(1:6) = (/'b','a','b','c','a','a'/) reglas(1,1:3) = (/'a','F','a'/) reglas(2,1:3) = (/'b','F','c'/) reglas(3,1:3) = (/'a','S','a'/) reglas(4,1:3) = (/'b','S','a'/) !/// recorro la cadena desde los extremos, hacia adentro, verifico // !/// que dichos extremos puedan ser generados por alguna regla // i = 1 pertenece = 0 !--- pertenece es cero inicialmente, la condicion de que la !--- cadena pertenece al leng. es cierta do while ((i.le.(tamanoCadena/2)).and.(pertenece==0)) !--- recorro mientras no llegue a la extremoIzq = cadena(i) !--- mitad o si se que ya no pertenece extremoDcho = cadena(tamanoCadena-i+1) pertenece = 1 !-- para c/par de extremos do regla = 1,n !-- digo que es falso if ((reglas(regla,1)==extremoIzq).and.(reglas(regla,3)==extremoDcho)) then !-- luego si pasa todas las if ((i /= tamanoCadena/2).and.(reglas(regla,2) == 'S')) then !-- condiciones es cierto pertenece = 0 !-- las condiciones son end if !-- extremos coincidentes con if ((i == tamanoCadena/2).and.(reglas(regla,2) == 'F')) then !-- alguna regla S y si pertenece = 0 !-- par de letras es end if !-- el mas interno, q corresponda end if !-- a una regla F end do i = i + 1 end do print *, "pertenece: ",pertenece end program lenguajeFormal