Newer
Older
% Třísměrný merge zdrojových souborů přes AST {#myslenky}
Základem této práce je logika přijímající a řešící kolizní stav, který vznikl při obecném řádkovém spojování, jako používá například verzovací nástroj git.
Nejdřív popíšu algoritmus obecně a v následujících kapitolách rozeberu každou část samostatně.
V první části se načítají tři vstupní soubory (báze, levá a pravá strana) a vytvoří se jejich AST. Algoritmem GumTree \cite{Falleri2014} se nalezne mapování uzlů mezi bází a levou, resp. pravou stranou. Novým algoritmem na základu \textsc{3dm} \cite{Lindholm2001} se tyto namapované stromy spojí do jednoho. Na závěr se ze vstupních souborů vyjmou ty části, které odpovídají spojenému stromu a vypíšou se jako výsledek.
\begin{figure}[H]
\includegraphics[width=\textwidth,scale=0.5]{images/bp-merge-impl}
\caption{Přehled kroků od vstupních souborů až po vypsání výsledku.}
\end{figure}
Hlavním přínosem této práce jsou tyto algoritmy:
- na spojování abstraktních syntaktických stromů libovolného jazyka \hyperref[spojovani-ast]{popsaného v kapitole},
- na transformaci AST zpět do kódu pomocí mapování na vstupní zdrojové kódy \hyperref[mapovani-na-kod]{v kapitole}.
K nalezení odpovídajících uzlů mezi jednou ze spojovaných větví a společnou větví se využívá algoritmu GumTree \cite{Falleri2014}, \hyperref[gumtree]{detailně popsaného v sekci}.
Algoritmus \textsc{3dm}, \hyperref[3dm]{popsaný v}, jsem v originální podobně nepoužil. Původní záměr spojit GumTree mapování a Lindholmův algoritmus z \textsc{3dm} na merge byl zmařen tím, jak moc je v \textsc{3dm} mapování a merge propojené. Definice \textit{far move}, mapování složitější než 1:1, a další z GumTree bez zbytečně složitých úprav nelze získat. Proto jsem se \textsc{3dm} pouze inspiroval, ale algoritmus navrhl nový, obecnější a tedy kompatibilní s GumTree.
Přestože cílem této práce je implementovat merge konkrétně pro jazyk PHP, jsou tyto algoritmy obecné a fungují pro AST každého jazyka. Liší se pouze výběr parseru, který je od ostatních částí striktně oddělen.
\input{myslenky/Merge.tex}