Pregunta

Estoy tratando de crear una gramática simple similar a BaSH en ANTLRv3 pero no he podido analizar (y verificar) la entrada dentro de los comandos de subshell.

Explicación adicional:

Quiero analizar la siguiente entrada:

$(command parameters*)

`command parameters`

"some text $(command parameters*)"

Y poder verificar su contenido como lo haría con una entrada simple como: parámetros de comando.

es decir:

Analizarlo generaría un árbol como

(SUBSHELL (CMD command (PARAM parameters*)))
(los tokens están en mayúsculas)


Puedo ignorar '$ (' y '' 's, pero eso no cubrirá los casos en que las subcapas se usan dentro de cadenas entre comillas dobles, como:

$ echo "String test $(ls -l) end"

Entonces ... ¿algún consejo sobre cómo puedo lograr esto?

¿Fue útil?

Solución

No estoy muy familiarizado con los detalles de Antlr v3, pero puedo decirte que no puedes manejar la sustitución de comandos al estilo bash dentro de cadenas entre comillas dobles en un lexer de estilo tradicional, ya que el anidamiento no se puede expresar usando una gramática regular. La mayoría de los compiladores-compiladores tradicionales restringen a los lexers el uso de gramáticas regulares para poder construir DFA eficientes para ellos. (Los Lexers, que irreductiblemente tienen que escanear todos los caracteres de la fuente, han sido históricamente una de las partes más lentas de un compilador).

Debe analizar " como un token y (idealmente) use un modo lexer o lexer diferente para las partes internas de las cadenas, de modo que la mayoría de los metacaracteres de shell, p. '{', no se analizan como tokens sino como texto; o alternativamente, elimine la división lexer-parser y utilice un enfoque sin escáner, de modo que el "lexer" la regla para las cadenas entre comillas dobles puede llamar al " analizador " regla para sustituciones de comandos.

Yo favorecería el enfoque sin escáner. Investigaría qué tan bien Antlr v3 admite escribir gramáticas que funcionan directamente sobre una secuencia de caracteres, en lugar de usar una secuencia de tokens.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top