Почему мое правило YACC не может быть уменьшено здесь? - PullRequest
0 голосов
/ 13 марта 2012

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

1 Ответ

1 голос
/ 13 марта 2012

Вы пробовали

| ClassDeclList ClassDecl

вместо

| ClassDecl ClassDeclList

?

Я помню это исправление многих проблем, когда я использовал CUP.

...