Bonjour,
Si l’objectif est simplement de recoller les lignes physiques terminées
par un antislash final, un filtre texte simple peut déjà faire le
travail, par exemple avec awk :
```sh
awk '{
if (sub(/\\$/, "")) printf "%s", $0;
else print;
}'
```
ou, en sed :
```sh
sed ':a;N;$!ba;s/\\\n//g'
```
La documentation GNU sed couvre bien le travail multi-lignes avec `N`
et les substitutions sur un espace de travail contenant des sauts de
ligne. ([GNU][1])
En revanche, j’aurais tendance à mettre un gros avertissement :
cela convient surtout à du code généré ou à un sous-ensemble bien
maîtrisé. Sur du C++ arbitraire, on peut tomber sur des cas pénibles
avec chaînes, commentaires, directives préprocesseur, etc.
J’ai regardé aussi du côté d’un reformateur comme uncrustify, mais
ce que je vois dans sa configuration documentée concerne l’espace
avant le `\` de continuation de ligne (`sp_before_nl_cont`), pas la
suppression de la continuation elle-même. ([GitHub][2])
Donc, à mon avis :
* pour du code généré par carburetta : un petit filtre awk/sed peut suffire ;
* pour du C++ général : il faudrait un outil plus conscient de
la grammaire, ou au minimum un filtre spécialisé avec hypothèses
explicites.
Librement,
Bernard
[1]:
https://www.gnu.org/software/sed/manual/html_node/Multiline-techniques.html?utm_source=chatgpt.com
"Multiline techniques (sed, a stream editor)"
[2]:
https://github.com/uncrustify/uncrustify/blob/master/documentation/htdocs/default.cfg?utm_source=chatgpt.com
"uncrustify/documentation/htdocs/default.cfg at master"
----- Basile Starynkevitch <[email protected]> a écrit :
> Bonjour la liste,
>
> J'utilise carburetta https://carburetta.com/ comme generateur
> d'analyseur lexical et syntaxique.
>
> Cet outil est très pratique, libre et facilement compilable sur Debian.
>
> Mais il requiert (à mon grand regret) en entrée un fichier avec (en
> plein d'endroits) une seule ligne logique en C++ par exemple voir le
> fichier
> https://github.com/RefPerSys/RefPerSys/blob/master/carbrepl_rps.cbrt
> et plus particulièrement dans le commit 96d25ff0bada41 de RefPerSys
> par exemple les lignes 160 à 169 du fichier carbrepl_rps.cbrt
>
> Le code C++ généré par carburetta (j'en utilise la version 0.8.28)
> contient les memes lignes logiques longues, par exemple
>
> #line 169 "carbrepl_rps.cbrt"
> { _Pragma("message \"token_action for INT\""); \
> (stack->sym_data_->v_.uv0_) = carbdata.cardata_i; \
> RPS_DEBUG_LOG(REPL, "token_action for INT tksrc=" << *tksrc \
> << " cardata_i=" << carbdata.cardata_i); \
> RPS_FATALOUT("INT token_action is incomplete tksrc=" \
> << tksrc << " sym=" << sym \
> << ":" << RPS_CARBREPL_SYMBOL_NAME(sym) \
> << RPS_FULL_BACKTRACE(1, "token_action INT")); \
> }
> #line 3484 "_carbrepl_rps.cc"
>
> mais les antislashs finaux en ligne physique m'indisposent, et je
> cherche un outil (filtre Linux) pour les enlever.
>
> Les conventions lexicales de C++ sont dans le détail très complexes,
> donc coder un tel filtre me parait compliqué
>
>
> Librement
> --
>
> Basile STARYNKEVITCH
> <[email protected]>
> 8 rue de la Faïencerie
> http://starynkevitch.net/Basile/
> 92340 Bourg-la-Reine
> https://github.com/bstarynk
> France
> https://github.com/RefPerSys/RefPerSys
> https://orcid.org/0000-0003-0908-5250
>