Бизон разбирает глобальные переменные и функции - PullRequest
0 голосов
/ 15 сентября 2018

Я строю компилятор для забавы, и в настоящее время я застрял на том, Как анализировать, когда несколько глобальных переменных или определений функций находятся в одном файле, например,

int a;
int b;

int main(){
    int c;
}

файл моего бизона (упрощенный) выглядит так:

ROOT : GLOB { printf("%s\n", "ACCEPTED" }
     ;

VAR_DEC // Assume this matches correctly

FUNC_DEF // Assume this matches correctly

GLOB_STMNT : VAR_DEC {  }
           | FUNC_DEF {  }
           ; 

GLOB_LIST : GLOB_LIST GLOB_STMNT {  }
          | GLOB_STMNT {  }
          ;

GLOB : GLOB_LIST {  }
     ;

Моя проблема здесь в том, что она всегда только уменьшает объявление firstvar, а затем печатает принятым. Любая идея о том, как уточнить последние 3 правила, чтобы уменьшить все 3 глобальных утверждения?

1 Ответ

0 голосов
/ 15 сентября 2018

"Алгоритм, используемый синтаксическим анализатором yacc, поощряет так называемые правила левой рекурсивной грамматики. Правила следующей формы соответствуют этому алгоритму:

    seq : item 
        | seq item 
        ;

Первое правило сокращено только для первого предмета; и второе правило сокращено для второго и всех последующих элементов. "

Итак, вы должны написать свое правило как:

GLOB_LIST : GLOB_STMNT {  }
          | GLOB_LIST GLOB_STMNT {  }
          ;
...