-
Notifications
You must be signed in to change notification settings - Fork 39
Closed
Labels
Description
При самоприменении в режиме RLMAKE_FLAGS=-X-OADS компилятор упал.
Выяснилось, что проблема в неверном порождении кода специализированной функции. Запуск
set RLMAKE_FLAGS=-X-OADS -X--log=__log.txtвыявил в логе следующее:
PutRASLCommands\1@1 {
s.FileHandle0#1 (CmdSentence e.SubCommands#2)
= <Putout s.FileHandle0#1 ' (CmdSentence'>
<PutRASLCommands@4 s.X#0 (e.X#0) e.X0#0>
<Putout s.FileHandle0#1 ' ) // CmdSentence'>;
В правой части появляются переменные s.X#0, e.X#0 и e.X0#0, которых нет в левой части. При генерации RASL’а для этой функции компилятор падает.
Переменные с индексами X порождаются в специализаторе:
refal-5-lambda/src/compiler/OptTree-Spec.ref
Lines 1510 to 1514 in 3cd08ed
| NameSignatureVars-Term { | |
| (e.KnownVars) (TkVariable s.Mode) | |
| = <NewVarName (e.KnownVars) s.Mode 'X' 0> : (e.KnownVars^) e.Index | |
| = (e.KnownVars) | |
| (TkVariable e.Index); |
Удалось построить небольшой тест, воспроизводящий проблему:
$ENTRY PutProgramElement {
e.Stars = <F () e.Stars>;
}
$SPEC F (e.LEFT) e.RIGHT;
F {
(e.Left) e.Right = <G (e.Left) e.Right>;
}
$SPEC G (e.LEFT) e.right;
G {
(e.Left) '*' e.Right = <F (e.Left '*') e.Right>;
(e.Left) /* empty */ = /* empty */;
}
В логе для теста:
G@2 {
(e.Left0#1) '*' e.Right#1 = <F@2 (e.X#0) e.X0#0>;