From b6d9b0ddbe96cc7494ada70d61e27af17ce39621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=B7=D0=B4=D0=B0=D0=B9=D1=89=D0=B8=D0=BA?= Date: Thu, 17 Mar 2016 07:36:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D1=81=D0=BE=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=C2=A0=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D1=86=D0=BE=D0=BC=20?= =?UTF-8?q?=D1=81=C2=A0=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Данная модификация нужна для реализации обоих оптимизаций (#15, #16). --- src/compiler/HightLevelRASL.sref | 219 +++++++++++++++++++++++-------- 1 file changed, 162 insertions(+), 57 deletions(-) diff --git a/src/compiler/HightLevelRASL.sref b/src/compiler/HightLevelRASL.sref index 501023d1..fd5d02b9 100644 --- a/src/compiler/HightLevelRASL.sref +++ b/src/compiler/HightLevelRASL.sref @@ -322,18 +322,18 @@ GenPattern { e.Pattern = ; + s.NumRanges (e.Vars) (e.MarkedPattern) e.Commands = + (e.Vars) (e.MarkedPattern) ; } { - (e.Vars) s.NumRanges e.Commands = + (e.Vars) (e.MarkedPattern) s.NumRanges e.Commands = (e.Vars) s.NumRanges - ((#CmdComment ) e.Commands); + ((#CmdComment ) e.Commands); } > >; @@ -345,179 +345,284 @@ Inc2 { DoGenPattern { // Распознавание литералов (символьных, целочисленных, имён) - s.NumRanges e.Ranges-B (s.Num (#TkChar s.Char) e.Range) e.Ranges-E + s.NumRanges + e.Ranges-B (#Junk e.Junk) (#Range s.Num (#TkChar s.Char) e.Range) e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num (#TkNumber s.Number) e.Range) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Junk e.Junk) (#Range s.Num (#TkNumber s.Number) e.Range) + e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num (#TkName e.Name) e.Range) e.Ranges-E + s.NumRanges + e.Ranges-B (#Junk e.Junk) (#Range s.Num (#TkName e.Name) e.Range) e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num (#TkIdentifier e.Name) e.Range) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Junk e.Junk) (#Range s.Num (#TkIdentifier e.Name) e.Range) + e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num e.Range (#TkChar s.Char)) e.Ranges-E + s.NumRanges + e.Ranges-B (#Range s.Num e.Range (#TkChar s.Char)) (#Junk e.Junk) e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num e.Range (#TkNumber s.Number)) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Range s.Num e.Range (#TkNumber s.Number)) (#Junk e.Junk) + e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num e.Range (#TkName e.Name)) e.Ranges-E + s.NumRanges + e.Ranges-B (#Range s.Num e.Range (#TkName e.Name)) (#Junk e.Junk) e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num e.Range (#TkIdentifier e.Name)) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Range s.Num e.Range (#TkIdentifier e.Name)) (#Junk e.Junk) + e.Ranges-E (e.Vars) (e.Commands) = ; // Распознавание скобок - s.NumRanges e.Ranges-B - (s.Num (#Brackets e.SubRange) e.Range) + s.NumRanges + e.Ranges-B + (#Junk e.Junk) (#Range s.Num (#Brackets e.SubRange) e.Range) e.Ranges-E (e.Vars) (e.Commands) = - e.Ranges-B (s.NumRanges e.SubRange) (s.Num e.Range) e.Ranges-E + e.Ranges-B + (#Junk e.Junk (#TkOpenBracket)) (#Range s.NumRanges e.SubRange) + (#Junk (#TkCloseBracket)) (#Range s.Num e.Range) + e.Ranges-E (e.Vars) (e.Commands (#CmdBrackets #AlgLeft s.Num s.NumRanges)) >; - s.NumRanges e.Ranges-B - (s.Num e.Range (#Brackets e.SubRange)) + s.NumRanges + e.Ranges-B + (#Range s.Num e.Range (#Brackets e.SubRange)) (#Junk e.Junk) e.Ranges-E (e.Vars) (e.Commands) = - e.Ranges-B (s.Num e.Range) (s.NumRanges e.SubRange) e.Ranges-E + e.Ranges-B + (#Range s.Num e.Range) (#Junk (#TkOpenBracket)) + (#Range s.NumRanges e.SubRange) (#Junk (#TkCloseBracket) e.Junk) + e.Ranges-E (e.Vars) (e.Commands (#CmdBrackets #AlgRight s.Num s.NumRanges)) >; // Распознавание АТД-скобок - s.NumRanges e.Ranges-B - (s.Num (#ADT-Brackets (e.Name) e.SubRange) e.Range) + s.NumRanges + e.Ranges-B + (#Junk e.Junk) (#Range s.Num (#ADT-Brackets (e.Name) e.SubRange) e.Range) e.Ranges-E (e.Vars) (e.Commands) = - e.Ranges-B (s.NumRanges e.SubRange) (s.Num e.Range) e.Ranges-E + e.Ranges-B + (#Junk e.Junk (#TkOpenADT) (#TkName e.Name)) + (#Range s.NumRanges e.SubRange) + (#Junk (#TkCloseADT)) (#Range s.Num e.Range) + e.Ranges-E (e.Vars) (e.Commands (#CmdADT #AlgLeft s.Num s.NumRanges e.Name)) >; - s.NumRanges e.Ranges-B - (s.Num e.Range (#ADT-Brackets (e.Name) e.SubRange)) + s.NumRanges + e.Ranges-B + (#Range s.Num e.Range (#ADT-Brackets (e.Name) e.SubRange)) (#Junk e.Junk) e.Ranges-E (e.Vars) (e.Commands) = - e.Ranges-B (s.Num e.Range) (s.NumRanges e.SubRange) e.Ranges-E + e.Ranges-B + (#Range s.Num e.Range) (#Junk (#TkOpenADT) (#TkName e.Name)) + (#Range s.NumRanges e.SubRange) (#Junk (#TkCloseADT) e.Junk) + e.Ranges-E (e.Vars) (e.Commands (#CmdADT #AlgRight s.Num s.NumRanges e.Name)) >; // Пустой диапазон - s.NumRanges e.Ranges-B (s.Num /* пусто */) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Junk e.Junk1) (#Range s.Num /* пусто */) (#Junk e.Junk2) + e.Ranges-E (e.Vars) (e.Commands) = ; // Распознавание переменных - s.NumRanges e.Ranges-B (s.Num (#TkVariable s.Mode e.Index) e.Range) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Junk e.Junk) (#Range s.Num (#TkVariable s.Mode e.Index) e.Range) + e.Ranges-E (e.Vars-B (s.Count s.Mode e.Index) e.Vars-E) (e.Commands) = s.Mode e.Index) e.Vars-E) (e.Commands (#CmdRepeated #AlgLeft s.Num s.Mode e.Index)) >; - s.NumRanges e.Ranges-B (s.Num e.Range (#TkVariable s.Mode e.Index)) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Range s.Num e.Range (#TkVariable s.Mode e.Index)) (#Junk e.Junk) + e.Ranges-E (e.Vars-B (s.Count s.Mode e.Index) e.Vars-E) (e.Commands) = s.Mode e.Index) e.Vars-E) (e.Commands (#CmdRepeated #AlgRight s.Num s.Mode e.Index)) >; // Диапазон с закрытой переменной - s.NumRanges e.Ranges-B (s.Num (#TkVariable 'e' e.Index)) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Junk e.Junk1) (#Range s.Num (#TkVariable 'e' e.Index)) (#Junk e.Junk2) + e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num (#TkVariable 's' e.Index) e.Range) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Junk e.Junk) (#Range s.Num (#TkVariable 's' e.Index) e.Range) + e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num (#TkVariable 't' e.Index) e.Range) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Junk e.Junk) (#Range s.Num (#TkVariable 't' e.Index) e.Range) + e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num e.Range (#TkVariable 's' e.Index)) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Range s.Num e.Range (#TkVariable 's' e.Index)) (#Junk e.Junk) + e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num e.Range (#TkVariable 't' e.Index)) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Range s.Num e.Range (#TkVariable 't' e.Index)) (#Junk e.Junk) + e.Ranges-E (e.Vars) (e.Commands) = ; - s.NumRanges e.Ranges-B (s.Num (#TkVariable 'e' e.Index) e.Range) e.Ranges-E + s.NumRanges + e.Ranges-B + (#Junk e.Junk) (#Range s.Num (#TkVariable 'e' e.Index) e.Range) + e.Ranges-E (e.Vars) (e.Commands) = ; // Завершение разбора. - s.NumRanges /* пусто */ (e.Vars) (e.Commands) = - s.NumRanges (e.Vars) e.Commands; + s.NumRanges (#Junk e.MarkedPattern) (e.Vars) (e.Commands) = + s.NumRanges (e.Vars) (e.MarkedPattern) e.Commands; } SaveBrackets { @@ -602,11 +707,11 @@ Brackets-Set { } TextFromPattern { - (#Brackets e.Inner) e.Tail = - ' (' ' )' ; + (#TkOpenBracket) e.Tail = ' (' ; + (#TkCloseBracket) e.Tail = ' )' ; - (#ADT-Brackets (e.Name) e.Inner) e.Tail = - ' [' e.Name ' ' ' ]' ; + (#TkOpenADT) (#TkName e.Name) e.Tail = ' [' e.Name ; + (#TkCloseADT) e.Tail = ' ]' ; (#TkChar s.Char) e.Tail = ' ' '' ;