Re : outil libre (fitre textuel Linux) reformattant du C++
Bernard Schoenacker <[email protected]> Wed, 1 Apr 2026 10:57:42 +0200 (CEST)
| Newsgroups | gmane.linux.debian.devel.french,gmane.linux.debian.user.french |
|---|---|
| Message-ID | <1378848802.450656478.1775033862729.JavaMail.root@zimbra19-e3.priv.proxad.net> |
Bonjour,
Si l=E2=80=99objectif est simplement de recoller les lignes physiques termi=
n=C3=A9es
par un antislash final, un filtre texte simple peut d=C3=A9j=C3=A0 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=E2=80=99aurais tendance =C3=A0 mettre un gros avertissement =
:
cela convient surtout =C3=A0 du code g=C3=A9n=C3=A9r=C3=A9 ou =C3=A0 un sou=
s-ensemble bien
ma=C3=AEtris=C3=A9. Sur du C++ arbitraire, on peut tomber sur des cas p=C3=
=A9nibles
avec cha=C3=AEnes, commentaires, directives pr=C3=A9processeur, etc.
J=E2=80=99ai regard=C3=A9 aussi du c=C3=B4t=C3=A9 d=E2=80=99un reformateur =
comme uncrustify, mais
ce que je vois dans sa configuration document=C3=A9e concerne l=E2=80=99esp=
ace
avant le `\` de continuation de ligne (`sp_before_nl_cont`), pas la
suppression de la continuation elle-m=C3=AAme. ([GitHub][2])
Donc, =C3=A0 mon avis :
* pour du code g=C3=A9n=C3=A9r=C3=A9 par carburetta : un petit filtre awk/s=
ed peut suffire ;
* pour du C++ g=C3=A9n=C3=A9ral : il faudrait un outil plus conscient de
la grammaire, ou au minimum un filtre sp=C3=A9cialis=C3=A9 avec hypoth=C3=
=A8ses
explicites.
Librement,
Bernard
[1]: https://www.gnu.org/software/sed/manual/html_node/Multiline-techniques=
.html?utm_source=3Dchatgpt.com "Multiline techniques (sed, a stream editor)=
"
[2]: https://github.com/uncrustify/uncrustify/blob/master/documentation/htd=
ocs/default.cfg?utm_source=3Dchatgpt.com "uncrustify/documentation/htdocs/d=
efault.cfg at master"
----- Basile Starynkevitch <[email protected]> a =C3=A9crit=C2=A0:
> Bonjour la liste,
>=20
> J'utilise carburetta https://carburetta.com/ comme generateur
> d'analyseur lexical et syntaxique.
>=20
> Cet outil est tr=C3=A8s pratique, libre et facilement compilable sur Debi=
an.
>=20
> Mais il requiert (=C3=A0 mon grand regret) en entr=C3=A9e 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=C3=A8rement dans le commit 96d25ff0bada41 de RefPerSys=
=20
> par exemple les lignes 160 =C3=A0 169 du fichier carbrepl_rps.cbrt
>=20
> Le code C++ g=C3=A9n=C3=A9r=C3=A9 par carburetta (j'en utilise la version=
0.8.28)
> contient les memes lignes logiques longues, par exemple=20
>=20
> #line 169 "carbrepl_rps.cbrt"
> { _Pragma("message \"token_action for INT\""); \
> (stack->sym_data_->v_.uv0_) =3D carbdata.cardata_i; \
> RPS_DEBUG_LOG(REPL, "token_action for INT tksrc=3D" << *tksrc \
> << " cardata_i=3D" << carbdata.cardata_i); \
> RPS_FATALOUT("INT token_action is incomplete tksrc=3D" \
> << tksrc << " sym=3D" << sym \
> << ":" << RPS_CARBREPL_SYMBOL_NAME(sym) \
> << RPS_FULL_BACKTRACE(1, "token_action INT")); \
> }
> #line 3484 "_carbrepl_rps.cc"
>=20
> mais les antislashs finaux en ligne physique m'indisposent, et je
> cherche un outil (filtre Linux) pour les enlever.
>=20
> Les conventions lexicales de C++ sont dans le d=C3=A9tail tr=C3=A8s compl=
exes,
> donc coder un tel filtre me parait compliqu=C3=A9
>=20
>=20
> Librement
> --=20
>=20
> Basile STARYNKEVITCH =20
> <[email protected]>
> 8 rue de la Fa=C3=AFencerie =20
> http://starynkevitch.net/Basile/ =20
> 92340 Bourg-la-Reine =20
> https://github.com/bstarynk
> France =20
> https://github.com/RefPerSys/RefPerSys
> https://orcid.org/0000-0003-0908-5250
>=20