Question

J'essaie de créer une simple grammaire de type BaSH sur ANTLRv3 mais je n'ai pas été en mesure d'analyser (et de vérifier) ??les entrées dans les commandes de sous-shell.

Explication complémentaire:

Je souhaite analyser l'entrée suivante:

$(command parameters*)

`command parameters`

"some text $(command parameters*)"

Et être capable de vérifier son contenu comme je le ferais avec une entrée simple telle que: paramètres de commande.

c'est-à-dire:

Son analyse générerait un arbre comme

(SUBSHELL (CMD command (PARAM parameters*)))
(les jetons sont en majuscule)


Je peux ignorer '$ (' s et '' ', mais cela ne couvrira pas les cas où les sous-shell sont utilisés dans des chaînes entre guillemets, comme:

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

Alors ... des conseils sur comment y parvenir?

Était-ce utile?

La solution

Je ne connais pas très bien les détails de Antlr v3, mais je peux vous dire que vous ne pouvez pas gérer la substitution de commandes de style bash à l'intérieur de chaînes entre guillemets dans un lexer de style traditionnel, car l'imbrication ne peut pas être exprimée. en utilisant une grammaire régulière. La plupart des compilateurs-compilateurs traditionnels interdisent aux lexers d'utiliser des grammaires régulières afin de pouvoir construire des DFA efficaces. (Les Lexers, qui doivent impérativement analyser chaque caractère de la source, ont toujours été l’une des parties les plus lentes du compilateur.)

Vous devez soit analyser " comme jeton et (idéalement), utilisez un lexer ou un mode lexer différent pour les éléments internes des chaînes, de sorte que la plupart des métacaractères du shell, par ex. '{', ne sont pas analysés comme des jetons mais comme du texte; ou bien, supprimez la division lexer-parser et utilisez une approche sans scanner, de sorte que le "lexer" La règle relative aux chaînes entre guillemets doubles peut être appelée dans l '"analyseur". règle pour les substitutions de commandes.

Je privilégierais l'approche sans scanner. Je voudrais vérifier dans quelle mesure Antlr v3 prend en charge l’écriture de grammaires fonctionnant directement sur un flux de caractères, plutôt que l’utilisation d’un flux de jetons.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top