I'm attemping to do compilers on javacc but I'm not sure if the following is legal when removing left recursion:
A = B AP APP
| C AP APP
AP = A AP | {}
APP = (D AP) APP | {}
I'm attemping to do compilers on javacc but I'm not sure if the following is legal when removing left recursion:
A = B AP APP
| C AP APP
AP = A AP | {}
APP = (D AP) APP | {}
Copyright © 2021 Jogjafile Inc.
I'm going to assume that B, C, and D are terminals. And I'm going to add one more nonterminal
The first choice is clearly resolvable on one token of look ahead. For the second choice we need that the first set of
A AP
be disjoint from the follow set ofAP
; the former is{<B>, <C>}
and the latter is{<EOF>,<D>}
. For the third choice, we need that<D>
is not in the follow set ofAPP
, which is{<EOF>}
.We now know the grammar is LL(1), so it should work with JavaCC.
Note: Determining whether a grammar will work with JavaCC is a bit more complicated, because JavaCC doesn't calculate follow sets exactly like the theory says and because JavaCC has lots of mechanisms that allow it to work with non-LL(1) grammars. But generally if your grammar is LL(1), JavaCC will handle it fine. Also if JavaCC isn't going to work, it gives a warning message.