Използвам YACC, за да направя моя проект за домашна работа на компилатора. Открих, че програмата ми не може да получи дървото на синтаксиса. Така че разпечатах всичко, за да видя какво се случва. Според моя резултат изглежда, че ClassDecl
не се редуцира до ClassDeclList
тук. Но не мога да разбера защо... може ли някой да ми помогне?
Примерният вход е:
program ex11;
class ab {
}
Отпечата се като:
programXXXX ex11ID
semicon abID
RBRACEnum
ClassBody ClassDecl ClassDecl1 Error!
Първите три реда са съобщения, които отпечатах от моя LEX файл, за да се уверя, че знаците са разпознати правилно.
Според информацията анализаторът успешно редуцира {}
до ClassBody
и class ab {}
до ClassDecl
. И тогава не се редуцира до ClassDeclList
, дали е защото пиша ляво рекурсивна граматика тук?
Това е частта от моята база от правила на YACC за извода:
Program: PROGRAMnum IDnum SEMInum ClassDeclList
{printf("program"); $$ = MakeTree(ProgramOp,$4, MakeLeaf(IDNode,$2)); printtree($$,0);};
ClassDeclList: ClassDecl
{printf("ClassDeclList1");$$ = MakeTree(ClassOp,NullExp(),$1); printf("ClassDeclListend");};
|ClassDecl ClassDeclList
{printf("ClassDeclList2");$$ = MakeTree(ClassOp,$2,$1); printf("ClassDeclList");};
ClassDecl: CLASSnum IDnum ClassBody
{printf("ClassDecl");$$=MakeTree(ClassDefOp,$3,MakeLeaf(IDNode,$2)); printf("ClassDecl1");};
Error!
? - person Some programmer dude   schedule 13.03.2012