Avatar billede sunlock Nybegynder
15. marts 2006 - 09:04 Der er 4 kommentarer og
1 løsning

JavaCC - left recursion detected?

Jeg har følgende kode til JavaCC, hvor den melder fejl:
----
void Expression():
{}
{
            Expression2() (AssignmentOperator() Expression2())*
}

void Expression2():
{}
{
        Expression3() (Expression2Rest())?
}

void Expression2Rest():
{}
{
                (InfixOp() Expression3())*
}

void Expression3():
{}
{
            (Expression() | Type()) Expression3() |
            Primary() (Selector())*
}
-----

Her er fejlen:
[javacc] Error: Line 383, Column 1: Left recursion detected: "Expression... --> Expression2... --> Expression3... --> Expression..."
 
(bemærk at linietallet ikke passer på javacc-filen men det output der kommer, og derfor kan det ikke bruges).

Mit problem er at jeg fra Expression() kan tage og ramme Expression() igen og derved få "left recursion".
Hvis der er et hoved som er super god til at fjerne sådan noget ville jeg bleve meget glad. Synes jeg har googlet, og har da også fundet en masse regler, men det bliver jeg ikke meget mere klog på ud over at man skal lave nogle andre produktionsregler.
Avatar billede jakoba Nybegynder
16. marts 2006 - 09:00 #1
Det er din syntax der ikke er eentydig, eller også skal implementeres på en anden måde

Som den er vil du uvægerligt få en uendelig løkke der hvor compileren når den forventer en expression vil kalde igennem din daisychain og så starte forfra med at forvente en expression, osv osv. Det må ikke ske.

Det er ikke JavaCC der er noget galt med, men den syntax du prøver at implementere.

Hvis du har du mulighed for at vise os den her (fx skrevet i BNF format) skal der nok være mange der kan pege på en alternativ udformning af syntaksen så du slipper af med den venstrerekursion.
Avatar billede sunlock Nybegynder
16. marts 2006 - 10:05 #2
Jeg har godt set at det er grammaren der er noget galt med, men kan ikke lige løse det. Jeg har taget udgangspunkt i Java Language Specification til 1.5 (den man kan få med JavaCC). Så har jeg fjernet en smule for at tilpasse det til det jeg skal bruge. De skriver selv at det ikke er en LL(1) grammar, men derfor kunne det godt være en som kunne overskue det.

BNF'en fremgår vel af ovenstående kode-stump (har ikke lige en BNF da det er fra JLS)?
Avatar billede sunlock Nybegynder
03. august 2006 - 10:48 #3
jakoba, vil du ha' nogle points eller skal jeg bare lukke?

Problemet blev løst ved at starte "from scratch"
Avatar billede jakoba Nybegynder
04. august 2006 - 11:58 #4
Tag dem selv, jeg løste jo ikke noget.
Avatar billede sunlock Nybegynder
04. august 2006 - 15:01 #5
Det gør jeg så :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester