
\section{Tips and Tricks}

This section presents some tips and tricks for using Coccinelle.

\subsection{How to remove useless parentheses?}

If you want to rewrite any access to a pointer value by a function
call, you may use the following semantic patch.

\begin{lstlisting}[language=Cocci]
@-- a = *b
@++ a = readb(b)
\end{lstlisting}

However, if for some reason your code looks like \verb|bar = *(foo)|,
you will end up with \verb|bar = readb((foo))| as the extra
parentheses around \texttt{foo} are capture by the metavariable
\texttt{b}.

In order to generate better output code, you can use the following
semantic patch instead.
\begin{lstlisting}[language=Cocci]
@-- a = *(b)
@++ a = readb(b)
\end{lstlisting}

\noindent
And rely on your standard.iso isomorphism file which should contain:
\begin{lstlisting}[language=Cocci]
Expression
@ paren @
expression E;
@@

 (E) => E
\end{lstlisting}

Coccinelle will then consider \verb|bar = *(foo)| as equivalent to
\verb|bar = *foo| (but not the other way around) and capture both.
Finally, it will generate \verb|bar = readb(foo)| as expected.

%%% Local Variables:
%%% mode: LaTeX
%%% TeX-master: "main_grammar"
%%% coding: utf-8
%%% TeX-PDF-mode: t
%%% ispell-local-dictionary: "american"
%%% End:
