2010-08-30 22 views

Respuesta

12

Las expresiones regulares, en la definición formal, que consiste solamente en:

  • concatenación (ab)
  • repetición ilimitada (a *)
  • alternancia (a | b)
  • agrupación ((ab) | (cd))

solo se pueden reconocer idiomas regulares. Un lenguaje de programación completo de Turing puede reconocer lenguajes enumerables recursivamente.

Un ejemplo es que las expresiones regulares no pueden decirle si una cadena consta de pares de paréntesis coincidentes: por ejemplo, se acepta ()(()) mientras ()((())(), mientras que los lenguajes de programación de Turing pueden completar.

(Tenga en cuenta que las expresiones regulares en lenguajes de programación modernos son más poderosos que la definición académica formal de expresiones regulares. Algunos pueden incluso ser Turing completo.)

+3

Por ejemplo, la expresión regular de Perl puede ser recursiva: http://www.catonmat.net/blog/recursive-regular-expressions PHP regexp tiene el indicador/e para evaluar las expresiones de PHP en la sustitución. –

+0

@SHi: gracias por eso, ¡muy interesante! –

+3

Una vez vimos una expresión regular en Perl que hacía coincidir cadenas con una longitud que era solo un número primo. Usé el back-track y tardé bastante ... –

3

Regular languages - los que se pueden describir como expresiones regulares - son not Turing complete.

Los lenguajes de marcado (utilizados para describir datos, no el cálculo) como XML y JSON no están completos.

+2

La diferencia entre los datos y el cálculo es complicado. [LaTeX] (http://stackoverflow.com/questions/2968411/ive-heard-that-latex-is-turing-complete-are-herehere-any-programs-written-in-latex) es Turing-completo, a pesar de siendo un lenguaje de procesamiento de texto. –

+1

@Phillip: No del todo justo, ya que LaTeX tiene acceso a todos los TeX que se pretende (al menos en parte) para ser un lenguaje de uso general. Consulte la página de Knuth, donde responde la pregunta "¿Cuál es su idioma favorito?". – Charles

Cuestiones relacionadas