Skip to content

Компилятор вылетает при самоприменении #319

@Mazdaywik

Description

@Mazdaywik

При самоприменении в режиме 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 порождаются в специализаторе:

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>;

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions