Я использую 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");};