<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Part of my research is detecting design patterns in Java sources.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Therefore it is necessary to parse Java sources</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
I used the grammar specified in <a href="https://docs.oracle.com/javase/specs/jls/se20/html/index.html" id="LPlnk584635">https://docs.oracle.com/javase/specs/jls/se20/html/index.html</a>.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
First, I made the grammar useful for the bottom-up parser generator cup (<a href="http://www2.cs.tum.edu/projects/cup/" id="LPlnk249011">http://www2.cs.tum.edu/projects/cup/</a>)</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
This resulted in more than 100 shifts/reduce and reduce/reduce conflicts.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
Reduce/reduce conflicts and suggest grammar mistakes.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
Second, I made the grammar useful for the top-down parser generator Grammatica (https://grammatica.percederberg.net).</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
This resulted in many errors because the LL () grammar is not valid.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
An example:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
The production rule for ClassOrInterfaceType and ClassType is:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
<span class="lhs ContentPasted3" style="font-family: monospace; font-size: 12px; font-style: italic; background-color: rgb(211, 211, 211);">ClassOrInterfaceType:</span>
<div class="rhs" style="margin-left: 1em; font-family: monospace; font-size: 12px; font-style: italic; background-color: rgb(211, 211, 211);">
<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-4.html#jls-ClassType" title="ClassType" class="ContentPasted3" data-loopstyle="link">ClassType</a><br class="ContentPasted3">
<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-4.html#jls-InterfaceType" title="InterfaceType" class="ContentPasted3">InterfaceType</a></div>
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
<span class="lhs ContentPasted2" style="font-family: monospace; font-size: 12px; font-style: italic; background-color: rgb(211, 211, 211);">ClassType:</span>
<div class="rhs ContentPasted2" style="margin-left: 1em; font-family: monospace; font-size: 12px; font-style: italic; background-color: rgb(211, 211, 211);">
{<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-9.html#jls-Annotation" title="Annotation" class="ContentPasted2" data-loopstyle="link">Annotation</a>}<span class="ContentPasted2"> </span><a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-3.html#jls-TypeIdentifier" title="TypeIdentifier" class="ContentPasted2">TypeIdentifier</a><span class="ContentPasted2"> </span>[<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-4.html#jls-TypeArguments" title="TypeArguments" class="ContentPasted2">TypeArguments</a>]<br class="ContentPasted2">
<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-6.html#jls-PackageName" title="PackageName" class="ContentPasted2">PackageName</a><span class="ContentPasted2"> </span><code class="literal ContentPasted2" style="font-style:normal">.</code><span class="ContentPasted2"> </span>{<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-9.html#jls-Annotation" title="Annotation" class="ContentPasted2">Annotation</a>}<span class="ContentPasted2"> </span><a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-3.html#jls-TypeIdentifier" title="TypeIdentifier" class="ContentPasted2">TypeIdentifier</a><span class="ContentPasted2"> </span>[<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-4.html#jls-TypeArguments" title="TypeArguments" class="ContentPasted2">TypeArguments</a>]<br class="ContentPasted2">
<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-4.html#jls-ClassOrInterfaceType" title="ClassOrInterfaceType" class="ContentPasted2">ClassOrInterfaceType</a><span class="ContentPasted2"> </span><code class="literal ContentPasted2" style="font-style:normal">.</code><span class="ContentPasted2"> </span>{<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-9.html#jls-Annotation" title="Annotation" class="ContentPasted2">Annotation</a>}<span class="ContentPasted2"> </span><a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-3.html#jls-TypeIdentifier" title="TypeIdentifier" class="ContentPasted2">TypeIdentifier</a><span class="ContentPasted2"> </span>[<a href="https://docs.oracle.com/javase/specs/jls/se20/html/jls-4.html#jls-TypeArguments" title="TypeArguments" class="ContentPasted2">TypeArguments</a>]</div>
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
This results in an infinite loop: ClassOrInterfaceType produces a ClassType and  ClassType produces </div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
ClassOrInterfaceType .....</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
Some production rules have more than one alternative which starts with @</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
which is not valid LL and can not be solved by looking ahead with more tokens.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
Is a valid bottom-up grammar e.g. LALR(1) of top-down grammar LL(k) available?<br>
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
ANTLR provides a LL() grammar for Java 9, that is of course out of date.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
With regards,</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
Ed van Doorn</div>
</body>
</html>