Разработка компиляторов

       

Пример использования error-правил


Пример использования error-правил

lines: lines expr '\n' { printf ("%d \n", $2); } | lines '\n' | /* empty */ | error '\n' { yyerror ("reenter last line:"); yyerrok; } ;

Ниже приведен пример использования error-правил в рассмотренной ранее программе, вычисляющей арифметическое выражение. Теперь, если поданная на вход строка не распознана как выражение, выведется сообщение с предложением ввести последнюю строку заново.

%union { int myValue; }

/* Terminals */ %token <myValue> Number_LC

%left '+' '-' %left '*' '/' %right UNARYMINUS

/* Nonterminals */ %type <myValue> expr

%start lines %%

/* Grammar rules */ lines: lines expr '\n' { printf ("%d \n", &2); } | lines '\n' | /* empty */ | error '\n' { yyerror ("reenter last line:"); yyerrok; } ;

expr: Number_LC { && = &1; } | expr '*' expr { && = &1*&3; } | expr '/' expr { && = &1/&3; } | expr '+' expr { && = &1+&3; } | expr '-' expr { && = &1-&3; } | '-' expr %prec UNARYMINUS { $$ = -&2; } ;



Содержание раздела