2016-12-09 4 views
-1

yyerror печатает «синтаксическую ошибку» в случае по умолчанию. Я хочу изменить параметр функции yyerror. Таким образом, я могу печатать более информативные сообщения об ошибках пользователю. Например, в функции declersion пользователь сделал неправильную вещь. Если бы я мог изменить параметр функции yyerror, я могу печатать более значимые сообщения пользователю.Как изменить параметр функции yyerror

func_Dec: код_ошибки = 1 .... var_dec: код_ошибки = 2 ....

в соответствии со значением ERROR_CODE. Я могу напечатать сообщение об ошибке, подобное этому в функции yyerror:

void yyerror(int x){ 
if(x==1){printf("error while function decleration");}; 
if(x==2){printf("error while variable decleration ");}; 
} 

ответ

2

Это будет очень сложно/невозможно.

Когда yacc встречает токен, который не находится в его переднем наборе, он уменьшается до тех пор, пока состояние в стеке не станет видимым, в котором действует токен. После того, как он уменьшил (выскочил) все состояния и стек стал пустым, он делает вывод, что он не может соответствовать токенам и отчетам Syntax error.

Что вы можете сделать, это сохранить информацию о состоянии того, что происходит, и использовать ее в yyerror.

Вы можете написать функцию yyerror самостоятельно. Обычно, если функция yyerror предоставляется, yacc использует функцию по умолчанию из библиотеки. Но вы можете написать его самостоятельно, например:

int yyerror(void) { 
    if (gMyState== ERR_DECL) printf("Error in function declaration\n); 
    else ... 
} 
0

Если вы используете Gnu Bison в качестве реализации YACC, вы можете запросить более информативные сообщения об ошибках с

%define parse.error verbose 

Обычно, вы также хотите, просить "LAC" (Lookahead Correction), которая улучшает токены предсказания, хотя есть стоимость эффективности:

%define parse.lac full 

Вы также можете использовать error productions, чтобы создавать зависящие от контекста сообщения об ошибках, но имейте в виду, чтоуже будет вызываться перед действием ошибки. Поэтому либо вам необходимо подавить распечатку в yyerror, либо организовать вывод yyerror, а результат действия ошибки дополнять друг друга.

Наконец, рассмотрите возможность использования (f) механизма отслеживания местоположения lex, чтобы вы могли хотя бы добавить номера строк в сообщения об ошибках.

Смежные вопросы