Saltar al contenido

Gramática POSIX sh EBNF

Posteriormente a buscar en varios repositorios y sitios de internet al concluir nos encontramos con la respuesta que te mostraremos más adelante.

Solución:

Investigué un poco más y encontré estos recursos:

  1. Un sh tutorial ubicado aquí

  2. Un libro de Bash que contiene la gramática BNF de Bash 2.0 (fuera de aquí) con el apéndice relevante todavía aquí

He mirado a través de las fuentes de bash, pdkshy posh pero no he encontrado nada remotamente al nivel de abstracción que necesito.

El estándar POSIX define la gramática para el shell POSIX. La definición incluye una gramática Yacc anotada. Como tal, se puede convertir a EBNF más o menos mecánicamente.

Si quieres una gramática ‘real’, entonces tienes que buscar más. Elija su ‘capa real’ y encuentre la fuente y descubra cuál es la gramática de eso.

Tenga en cuenta que EBNF no se usa ampliamente. Tiene un valor práctico limitado, sobre todo porque esencialmente no hay herramientas que lo respalden. Por lo tanto, es poco probable que encuentre una gramática EBNF (de casi cualquier cosa) lista para usar.

Tuve varios intentos de escribir mis propios intérpretes de Bash completos durante el año pasado, y también llegué en algún momento a la misma referencia del apéndice del libro que se indica en la respuesta marcada (n. ° 2), pero no es completamente correcto/actualizado (por ejemplo, no define reglas de producción usando la palabra clave reservada ‘coproc’ y tiene una definición de regla de producción duplicada para una redirección usando ‘<&', podría haber más problemas, pero esos son los que he notado).

  1. La mejor manera que he encontrado fue ir a http://ftp.gnu.org/gnu/bash/
  2. Descargue las fuentes de la versión actual de bash
  3. Abra el archivo parse.y (que en este caso es el archivo YACC que básicamente contiene toda la lógica de análisis que usa bash) y simplemente copie y pegue las líneas entre ‘%%’ en su editor de texto favorito, que definen las reglas de producción de la gramática.
  4. Luego, usando un poco de expresiones regulares (que por cierto soy terrible) podemos eliminar la lógica de código adicional que se encuentra entre ‘…’ para hacer que la gramática se vea más como BNF.

La expresión regular que usé fue:

((s+.*?)+)s+([;|])

Coincide con cualquier línea sin codicia. .*? incluyendo espacios y nuevas líneas s+ que están entre llaves, y específicamente la última llave de cierre antes de una ; o | personaje. Luego simplemente reemplacé las cadenas coincidentes para 3 (por ejemplo, el resultado del tercer grupo de captura, siendo ; o |).

Aquí está la definición de gramática que logré extraer en el momento de la publicación. https://pastebin.com/qpsK4TF6

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *