diff --git a/autotests/opt-patternA.sref b/autotests/opt-patternA.sref new file mode 100644 index 00000000..9f26376f --- /dev/null +++ b/autotests/opt-patternA.sref @@ -0,0 +1,360 @@ +//FROM refalrts + +$ENTRY Go { + = + >; +} + +RESULT { + (#CmdFuncArray 6 + ('DoGetFileName' ) + ('GetLastPartName' ) + ('Lower' ) + ('Exit' ) + ('CreateErrorFileMark' ) + ('WriteLine' ) + ) + (#CmdIdentArray 0 + ) + (#CmdStringArray 5 + ('e.FileName#1' ) + ('s.Last#1' ) + ('LINK ERROR: ' ) + ('e.Message#1' ) + ('t.Config#1' ) + ) + (#LABEL 1 ) + (#CmdVar #AlgLeft 2 't' 5 ) + (#CmdVariableDebugTable 4 5 ) + (#CmdVariableDebugTable 3 2 ) + (#CmdCreateElem #Allocate 7 #ElName 5 ) + (#CmdCreateElem #Allocate 8 #ElString 2 ) + (#CmdCreateElem #Allocate 12 #ElName 4 ) + (#CmdCreateElem #Allocate 15 #ElName 3 ) + (#CmdCreateElem #Allocate 16 #ElNumber 1 ) + (#CmdInsertRange 8 ) + (#LABEL 141 ) + (#CmdCallSave #AlgLeft 0 2 ) + (#CmdChar #AlgRight 2 'l' ) + (#CmdChar #AlgRight 2 's' ) + (#CmdChar #AlgRight 2 'a' ) + (#CmdChar #AlgRight 2 'r' ) + (#CmdChar #AlgRight 2 '.' ) + (#CmdVariableDebugTable 0 2 ) + (#CmdCreateElem #Allocate 6 #ElName 2 ) + (#CmdCreateElem #Allocate 8 #ElName 1 ) + (#LABEL 142 ) + (#CmdCallSave #AlgLeft 0 2 ) + (#CmdVariableDebugTable 0 2 ) + (#CmdCreateElem #Allocate 6 #ElName 0 ) + (#LABEL 146 ) + (#CmdCallSave #AlgLeft 0 2 ) + (#CmdOnFailGoTo 145 "Func name:" 'DoGetFileName' ) + (#CmdSave 2 5 ) + (#CmdVar #AlgRight 5 's' 7 ) + (#CmdOnFailGoTo 143 "Func name:" 'DoGetFileName' ) + (#CmdChar #AlgTerm 7 '/' ) + (#CmdVariableDebugTable 0 5 ) + (#LABEL 143 ) + (#CmdProfilerStopSentence ) + (#CmdOnFailGoTo 144 "Func name:" 'DoGetFileName' ) + (#CmdChar #AlgTerm 7 '\\' ) + (#CmdVariableDebugTable 0 5 ) + (#LABEL 144 ) + (#CmdProfilerStopSentence ) + (#CmdVariableDebugTable 1 7 ) + (#CmdVariableDebugTable 0 5 ) + (#CmdCreateElem #Allocate 9 #ElName 0 ) + (#LABEL 145 ) + (#CmdProfilerStopSentence ) + (#CmdEmpty #AlgLeft 2 ) + = ; +} + + +Inc { + 0 = 1; 1 = 2; 2 = 3; 3 = 4; 4 = 5; + 5 = 6; 6 = 7; 7 = 8; 8 = 9; 9 = 0; +} + +Map-RemoveNumber { + (s.Number e.Name) e.Rest = (e.Name) ; + /* пусто */ = /* пусто */; +} + +OutlineConstants { + (s.NextFunc e.Funcs) + (s.NextIdent e.Idents) + (s.NextString e.Strings) + /* пусто */ = + (#CmdFuncArray s.NextFunc ) + (#CmdIdentArray s.NextIdent ) + (#CmdStringArray s.NextString ); + + (s.NextFunc e.Funcs-B (s.Num e.Func) e.Funcs-E) (e.Idents) + (e.Strings) + e.Commands + (#CmdName s.Direction s.BracketNum e.Func) = + + (#CmdName s.Direction s.BracketNum s.Num); + + (s.NextFunc e.Funcs) (e.Idents) (e.Strings) + e.Commands + (#CmdName s.Direction s.BracketNum e.Func) = + e.Funcs (s.NextFunc e.Func)) (e.Idents) + (e.Strings) + e.Commands + > + (#CmdName s.Direction s.BracketNum s.NextFunc); + + (s.NextFunc e.Funcs-B (s.Num e.Func) e.Funcs-E) (e.Idents) + (e.Strings) + e.Commands + (#CmdNameSave s.Direction s.BracketNum s.SaveOffset e.Func) = + + (#CmdNameSave s.Direction s.BracketNum s.SaveOffset s.Num); + + (s.NextFunc e.Funcs) (e.Idents) (e.Strings) + e.Commands + (#CmdNameSave s.Direction s.BracketNum s.SaveOffset e.Func) = + e.Funcs (s.NextFunc e.Func)) (e.Idents) + (e.Strings) + e.Commands + > + (#CmdNameSave s.Direction s.BracketNum s.SaveOffset s.NextFunc); + + (s.NextFunc e.Funcs-B (s.Num e.Func) e.Funcs-E) (e.Idents) + (e.Strings) + e.Commands + (#CmdCreateElem s.CreateMode s.ElemNo #ElName e.Func) = + + (#CmdCreateElem s.CreateMode s.ElemNo #ElName s.Num); + + (s.NextFunc e.Funcs) (e.Idents) (e.Strings) + e.Commands + (#CmdCreateElem s.CreateMode s.ElemNo #ElName e.Func) = + e.Funcs (s.NextFunc e.Func)) (e.Idents) + (e.Strings) + e.Commands + > + (#CmdCreateElem s.CreateMode s.ElemNo #ElName s.NextFunc); + + (s.NextFunc e.Funcs-B (s.Num e.Func) e.Funcs-E) (e.Idents) + (e.Strings) + e.Commands + (#CmdADT s.Direction s.BracketNum s.InnerBrackets e.Func) = + + (#CmdADT s.Direction s.BracketNum s.InnerBrackets s.Num); + + (s.NextFunc e.Funcs) (e.Idents) (e.Strings) + e.Commands + (#CmdADT s.Direction s.BracketNum s.InnerBrackets e.Func) = + e.Funcs (s.NextFunc e.Func)) (e.Idents) + (e.Strings) + e.Commands + > + (#CmdADT s.Direction s.BracketNum s.InnerBrackets s.NextFunc); + + (s.NextFunc e.Funcs-B (s.Num e.Func) e.Funcs-E) (e.Idents) + (e.Strings) + e.Commands + (#CmdADTSave s.Direction s.BracketNum s.InnerBrackets e.Func) = + + (#CmdADTSave s.Direction s.BracketNum s.InnerBrackets s.Num); + + (s.NextFunc e.Funcs) (e.Idents) (e.Strings) + e.Commands + (#CmdADTSave s.Direction s.BracketNum s.InnerBrackets e.Func) = + e.Funcs (s.NextFunc e.Func)) (e.Idents) + (e.Strings) + e.Commands + > + (#CmdADTSave s.Direction s.BracketNum s.InnerBrackets s.NextFunc); + + (e.Funcs) (s.NextIdent e.Idents-B (s.Num e.Ident) e.Idents-E) + (e.Strings) + e.Commands + (#CmdIdent s.Direction s.BracketNum e.Ident) = + + (#CmdIdent s.Direction s.BracketNum s.Num); + + (e.Funcs) (s.NextIdent e.Idents) (e.Strings) + e.Commands + (#CmdIdent s.Direction s.BracketNum e.Ident) = + e.Idents (s.NextIdent e.Ident)) + (e.Strings) + e.Commands + > + (#CmdIdent s.Direction s.BracketNum s.NextIdent); + + (e.Funcs) (s.NextIdent e.Idents-B (s.Num e.Ident) e.Idents-E) + (e.Strings) + e.Commands + (#CmdIdentSave s.Direction s.BracketNum s.SaveOffset e.Ident) = + + (#CmdIdentSave s.Direction s.BracketNum s.SaveOffset s.Num); + + (e.Funcs) (s.NextIdent e.Idents) (e.Strings) + e.Commands + (#CmdIdentSave s.Direction s.BracketNum s.SaveOffset e.Ident) = + e.Idents (s.NextIdent e.Ident)) + (e.Strings) + e.Commands + > + (#CmdIdentSave s.Direction s.BracketNum s.SaveOffset s.NextIdent); + + (e.Funcs) (s.NextIdent e.Idents-B (s.Num e.Ident) e.Idents-E) + (e.Strings) + e.Commands + (#CmdCreateElem s.CreateMode s.ElemNo #ElIdent e.Ident) = + + (#CmdCreateElem s.CreateMode s.ElemNo #ElIdent s.Num); + + (e.Funcs) (s.NextIdent e.Idents) (e.Strings) + e.Commands + (#CmdCreateElem s.CreateMode s.ElemNo #ElIdent e.Ident) = + e.Idents (s.NextIdent e.Ident)) + (e.Strings) + e.Commands + > + (#CmdCreateElem s.CreateMode s.ElemNo #ElIdent s.NextIdent); + + (e.Funcs) (e.Idents) + (s.NextStringId e.Strings-B (s.Id e.String) e.Strings-E) + e.Commands + (#CmdCreateElem s.CreateMode s.ElemNo #ElString e.String) = + + (#CmdCreateElem s.CreateMode s.ElemNo #ElString s.Id); + + (e.Funcs) (e.Idents) (s.NextStringId e.Strings) + e.Commands + (#CmdCreateElem s.CreateMode s.ElemNo #ElString e.String) = + e.Strings (s.NextStringId e.String)) + e.Commands + > + (#CmdCreateElem s.CreateMode s.ElemNo #ElString s.NextStringId); + + (e.Funcs) (e.Idents) + (s.NextStringId e.Strings-B (s.Id e.VarName) e.Strings-E) + e.Commands + (#CmdVariableDebugTable e.VarName s.Offset) = + + (#CmdVariableDebugTable s.Id s.Offset); + + (e.Funcs) (e.Idents) + (s.NextStringId e.Strings) + e.Commands + (#CmdVariableDebugTable e.VarName s.Offset) = + e.Strings (s.NextStringId e.VarName)) + e.Commands + > + (#CmdVariableDebugTable s.NextStringId s.Offset); + + (e.Funcs) (e.Idents) (e.Strings) + e.Commands + t.OtherCommand = + + t.OtherCommand; +} diff --git a/src/compiler/HighLevelRASL-ConjointFunc-Ref.ref b/src/compiler/HighLevelRASL-ConjointFunc-Ref.ref index de312996..e36956bd 100644 --- a/src/compiler/HighLevelRASL-ConjointFunc-Ref.ref +++ b/src/compiler/HighLevelRASL-ConjointFunc-Ref.ref @@ -105,25 +105,47 @@ GenerateCommandsOfGroups { = : { ForGroup (e.NewGCG-Subst) (e.FirstGroup) e.SecondGroup - = (e.FirstGroup) e.SecondGroup; - - /* - TODO: грязный хак. - На вход функции DoFindDivision падают подстановки, которые сами могут - иметь нетривиальный ГСО. При этом вызывающий код ожидает, - что возвращаемое значение долно быть короче, чем аргумент функции. - */ - ForAllSentences (e.NewGCG-Subst) e.Sentences t.Last - = (e.Sentences) t.Last; - } - : (e.FirstGroup) e.SecondGroup + = ; - = ; + ForAllSentences (e.NewGCG-Subst) e.SentencesWithSubst^ + + = + : s.BaseNum^ e.NewGCG-Subst^ + + = : e.SubstsAndJunks + + = + : s.ContextSize^ (e.CmdSaves) e.SubstsAndJunks^ + + = + : s.ContextSize^ (e.Vars) (e.MarkedPattern^) e.GCG-Commands + + = + : e.SentencesWithSubst^ + + = + : (/* пусто */) e.GlobalGen^ + + = + : s.ContextSize^ e.Commands + + = s.ContextSize e.GCG-Commands e.Commands; + } } GenerateOneSentence { @@ -344,6 +366,18 @@ EnumerateVarsRec { >; } +EnumerateVars-Subst { + s.StartNumber e.Substitute + = : s.NextNumber^ e.Value^ + = s.NextNumber (e.Value ':' (e.Var)) + } + s.StartNumber e.Substitute + >; +} + /* @@ -481,6 +515,31 @@ Substitute { >; } +NarrowSentenceSubstitutions { + (e.NewGCG-Subst) e.Sentences + = ) + e.Conditions + (e.Result) + ); + } + e.Sentences + >; +} + +NarrowSubst { + (e.GCG-Substs-B (e.GCG ':' (e.Var)) e.GCG-Substs-E) + ((e.Pattern ':' (e.Var)) e.SentenceSubsts) + = : Clear e.NarrowSubsts + = e.NarrowSubsts + ; + + () () = /* пусто */; +} + /* Объединяет наборы подстановок по обобщению (по t.Var справа от ':') */ CollectSubsts { e.Before (/* подстановки закончились */) e.Other = /* пусто */;