Я пишу парсер и проверяю сообщение об ошибке.
Но когда я иду в петле, как
while (index <= n && index> 0) делать ...
мой синтаксис в порядке.
но процесс для запуска кода этой строки, по моим следам,
он сначала отслеживает выражение: index> 0, затем отслеживает выражение && expression,
последнее будет первым выражением (index <= n). но почему? <br/>
Не правильно ли сначала проверить индекс <= n, а затем индекс> 0, последним будет выражение && выражение?
Только в одном условии все будет хорошо.
например, как: while (index <= n) do <br />
Но если это комбинированные условия, все идет не так.
это мой частичный код
expr: expr LE expr
{<br/>
Trace("expression <= expression");
if ($1->type != $3->type) yyerror("type not match");
if ($1->type != intType && $1->type != realType) yyerror("operator error");
idInfo *info = new idInfo();
info->attribute = 2; //variable type
info->type = boolType;
$$ = info;
}<br/>
|expr AND expr
{
Trace("expression && expression");
if ($1->type != $3->type) yyerror("type not match");
if ($1->type != boolType) yyerror("operator error");
idInfo *info = new idInfo();
info->attribute = 2; //variable type
info->type = boolType;
$$ = info;
}
|expr GG expr
{<br/>
Trace("expression > expression");
if ($1->type != $3->type) yyerror("type not match");
if ($1->type != intType && $1->type != realType) yyerror("operator error");
idInfo *info = new idInfo();
info->attribute = 2; //variable type
info->type = boolType;
$$ = info;
}
Это результат по моему следу ....
в то время как
'('
ID: индекс
<= <Бр />
ID: п
&&
ID: индекс
'>'
INTEGER: 0
')'
Строка: 16 выражений> выражение
Строка: 16 выражений && выражение
Линия: 16 тип не соответствует
Строка: 16 ошибка оператора
Строка: 16 выражений <= выражение <br />
Линия: 16 тип не совпадает