Is there any algorithm that tells us how to modify semantic actions associated with a left-recursive grammar? For example, we have the following grammar, and its associated semantic actions:$ S \rightarrow id = expr $  { S.s = expr.size }S $\rightarrow$ if expr then $S_1$ else $S_2$ { $S_1.t = S.t + 2; $$S_2.t = S.t + 2;$ $S.s = expr.size + S_1.size + S_2.size + 2;$ }S $\rightarrow$ while expr do $S_1$ { $S_1.t = S.t + 4;$ $S.s = expr.size + S_1.s + 1;$ }S $\rightarrow$ $S_1$ ; $S_2$  {$S_1.t = S_2.t = S.t;$ $S.s = S_1.s + S_2.s; $ }Clearly the non-recursive version of the grammer is:S $\rightarrow$ id = expr T S $\rightarrow$ if expr then $S_1$ else $S_2$ TS $\rightarrow$ while expr do $S_1$ TT $\rightarrow$ ; $S_2$ TT $\rightarrow$ $\epsilon$But we also need to change the semantic actions accordingly. Any ideas how this can be done?
How to modify semantic actions when removing left-recursion from a grammer
formal grammars;compilers;semantics;left recursion
From what I have discovered, there is no general technique to modify the semantic actions while removing left-recursion. Instead, the best method is to take a representative example, draw its parse tree, and then checking which semantic actions give us the same result as the previous grammar.