Я создаю компилятор для школьного проекта. Все работает отлично, но у меня возникают трудности с определением грамматики для функций. Я должен определить, есть ли ноль или более параметров, и если эта функция является прототипом или определением. Я продолжаю получать/уменьшать и/или уменьшать/уменьшать ошибки. Я пробовал много вариантов безрезультатно. Вот что я имею, только ищущие указатели в другом направлении или идеи о том, как это исправить.Создание грамматики для прототипов функций и объявления bison
function : parameters ';' {free_ast($2); $$ = $1;}
| parameters block {$$ = adopt1($1, $2)}
;
parameters : paramlist ')' {free_ast($2); $$ = $1;}
| '(' identdecl ')' {free_ast($3); $$ = adopt_func2($1, $2);}
;
paramlist : paramlist ',' identdecl {free_ast($2);
$$ = adopt1($1, $2);}
| '(' identdecl {$$ = adopt_func2($1, $2);}
identdecl : basetype TOK_ARRAY TOK_IDENT {$$ = adopt2($1, $2,
change_symbol(
$3, TOK_DECLID));}
| basetype TOK_IDENT {$$ = adopt1($1,
change_symbol(
$2, TOK_DECLID));}
;
block : stateseq '}' {free_ast($2); $$ = $1;}
| ';' {free_ast($1);}
;
принимает_func2 принимает определение, поэтому частью моей проблемы будет место для принятия_прото. Спасибо за ваше время.
В чем разница между прототипом и декларацией? Что такое грамматика? Как это относится к C++? – Potatoswatter
Мне жаль добавить C++, я использую C++ для написания всего остального. Уже поздно, и я некоторое время работаю над этим. Прототип не имеет блока, и определение имеет значение, как и C++. поэтому int foo(); // proto и int foo() {...} для определения. Также есть точка с запятой. –
Прототипом в C++ является объявление. A * definition * - это то, что включает тело функции. – Potatoswatter