GenPattern {
// Распознавание литералов (символьных, целочисленных, имён)
e.Pattern-B (LeftPtr s.Num 0) t.Command e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'Create Left Vector'><GenPattern
e.Pattern-B (LeftPtr s.Num 1) t.Command e.Pattern-E
(e.Vars) (e.Commands (CmdCreateVector AlgLeft s.Num))
>;
e.Pattern-B (LeftPtr s.Num s.FixCount) (TkChar s.Char) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'CharLeft'><WriteLine s.FixCount><GenPattern
e.Pattern-B (TkChar s.Char) (LeftPtr s.Num <Inc s.FixCount>) e.Pattern-E
(e.Vars) (e.Commands (CmdChar AlgLeft s.Num s.Char))
>;
e.Pattern-B (LeftPtr s.Num s.FixCount) (TkNumber s.Number) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'NumberLeft'><WriteLine s.FixCount><GenPattern
e.Pattern-B (TkNumber s.Number) (LeftPtr s.Num <Inc s.FixCount>) e.Pattern-E
(e.Vars) (e.Commands (CmdNumber AlgLeft s.Num s.Number))
>;
e.Pattern-B (LeftPtr s.Num s.FixCount) (TkName e.Name) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'NameLeft'><WriteLine s.FixCount><GenPattern
e.Pattern-B (TkName e.Name) (LeftPtr s.Num <Inc s.FixCount>) e.Pattern-E
(e.Vars) (e.Commands (CmdName AlgLeft s.Num e.Name))
>;
e.Pattern-B (LeftPtr s.Num s.FixCount) (TkIdentifier e.Name) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'IdentLeft'><WriteLine s.FixCount><GenPattern
e.Pattern-B (TkIdentifier e.Name) (LeftPtr s.Num <Inc s.FixCount>) e.Pattern-E
(e.Vars) (e.Commands (CmdIdent AlgLeft s.Num e.Name))
>;
e.Pattern-B t.Command (RightPtr s.Num 0) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'Create Right Vector'><GenPattern
e.Pattern-B t.Command (RightPtr s.Num 1) e.Pattern-E
(e.Vars) (e.Commands (CmdCreateVector AlgRight s.Num))
>;
e.Pattern-B (TkChar s.Char) (RightPtr s.Num s.FixCount) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'CharRight'><WriteLine s.FixCount><GenPattern
e.Pattern-B (RightPtr s.Num <Inc s.FixCount>) (TkChar s.Char) e.Pattern-E
(e.Vars) (e.Commands (CmdChar AlgRight s.Num s.Char))
>;
e.Pattern-B (TkNumber s.Number) (RightPtr s.Num s.FixCount) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'NumberRight'><WriteLine s.FixCount><GenPattern
e.Pattern-B (RightPtr s.Num <Inc s.FixCount>) (TkNumber s.Number) e.Pattern-E
(e.Vars) (e.Commands (CmdNumber AlgRight s.Num s.Number))
>;
e.Pattern-B (TkName e.Name) (RightPtr s.Num s.FixCount) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'NameRight'><WriteLine s.FixCount><GenPattern
e.Pattern-B (RightPtr s.Num <Inc s.FixCount>) (TkName e.Name) e.Pattern-E
(e.Vars) (e.Commands (CmdName AlgRight s.Num e.Name))
>;
e.Pattern-B (TkIdentifier e.Name) (RightPtr s.Num s.FixCount) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'IdentRight'><WriteLine s.FixCount><GenPattern
e.Pattern-B (RightPtr s.Num <Inc s.FixCount>) (TkIdentifier e.Name) e.Pattern-E
(e.Vars) (e.Commands (CmdIdent AlgRight s.Num e.Name))
>;
// Распознавание скобок
e.Pattern-B (LeftPtr s.Num s.FixCount) (TkOpenBracket s.Inner)
e.Pattern-M (TkCloseBracket s.Inner) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'BracketsLeft'><WriteLine s.FixCount><GenPattern
e.Pattern-B (TkOpenBracket s.Inner)
(LeftPtr s.Inner 0) e.Pattern-M (RightPtr s.Inner 0)
(TkCloseBracket s.Inner) (LeftPtr s.Num <Inc s.FixCount>) e.Pattern-E
(e.Vars) (e.Commands (CmdBrackets AlgLeft s.Num s.Inner))
>;
e.Pattern-B (TkOpenBracket s.Inner) e.Pattern-M
(TkCloseBracket s.Inner) (RightPtr s.Num s.FixCount) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'BracketsRight'><WriteLine s.FixCount><GenPattern
e.Pattern-B (RightPtr s.Num <Inc s.FixCount>) (TkOpenBracket s.Inner)
(LeftPtr s.Inner 0) e.Pattern-M (RightPtr s.Inner 0)
(TkCloseBracket s.Inner) e.Pattern-E
(e.Vars) (e.Commands (CmdBrackets AlgRight s.Num s.Inner))
>;
// Распознавание АТД-скобок
e.Pattern-B (LeftPtr s.Num s.FixCount) (TkOpenADT s.Inner)
(TkName e.Name) e.Pattern-M (TkCloseADT s.Inner) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'ADTLeft'><WriteLine s.FixCount><GenPattern
e.Pattern-B (TkOpenADT s.Inner) (TkName e.Name)
(LeftPtr s.Inner 0) e.Pattern-M (RightPtr s.Inner 0)
(TkCloseADT s.Inner) (LeftPtr s.Num <Inc s.FixCount>) e.Pattern-E
(e.Vars)
(e.Commands (CmdADT AlgLeft s.Num s.Inner e.Name))
>;
e.Pattern-B (TkOpenADT s.Inner) (TkName e.Name) e.Pattern-M
(TkCloseADT s.Inner) (RightPtr s.Num s.FixCount) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'ADTRight'><WriteLine s.FixCount><GenPattern
e.Pattern-B (RightPtr s.Num <Inc s.FixCount>) (TkOpenADT s.Inner)
(TkName e.Name) (LeftPtr s.Inner 0) e.Pattern-M (RightPtr s.Inner 0)
(TkCloseADT s.Inner) e.Pattern-E
(e.Vars)
(e.Commands (CmdADT AlgRight s.Num s.Inner e.Name))
>;
// Указатели аннигилируют при встрече
e.Pattern-B (LeftPtr s.Num s.FixCount) (RightPtr s.Num s.FixCount) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'Annihilate'><WriteLine s.FixCount><GenPattern
e.Pattern-B e.Pattern-E
(e.Vars) (e.Commands (CmdEmpty s.Num))
>;
// Распознавание переменных
e.Pattern-B (LeftPtr s.Num s.FixCount) (TkVariable s.Mode e.Index) e.Pattern-E
(e.Vars-B (s.Count s.Mode e.Index) e.Vars-E) (e.Commands) =
<WriteLine 'RepeatedLeft'><GenPattern
e.Pattern-B (TkVariable s.Mode e.Index) (LeftPtr s.Num) e.Pattern-E
(e.Vars-B (<Inc s.Count> s.Mode e.Index) e.Vars-E)
(e.Commands (CmdRepeated AlgLeft s.Num <Inc s.Count> s.Mode e.Index))
>;
e.Pattern-B (TkVariable s.Mode e.Index) (RightPtr s.Num) e.Pattern-E
(e.Vars-B (s.Count s.Mode e.Index) e.Vars-E) (e.Commands) =
<WriteLine 'RepeatedRight'><GenPattern
e.Pattern-B (RightPtr s.Num) (TkVariable s.Mode e.Index) e.Pattern-E
(e.Vars-B (<Inc s.Count> s.Mode e.Index) e.Vars-E)
(e.Commands (CmdRepeated AlgRight s.Num <Inc s.Count> s.Mode e.Index))
>;
// Указатели аннигилируют через закрытую e-переменную
e.Pattern-B (LeftPtr s.Num) (TkVariable 'e' e.Index)
(RightPtr s.Num) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'ClosedEAnnihilate'><GenPattern
e.Pattern-B (TkVariable 'e' e.Index) e.Pattern-E
(e.Vars (1 'e' e.Index))
(e.Commands (CmdClosedE AlgLeft s.Num 'e' e.Index))
>;
e.Pattern-B (LeftPtr s.Num) (TkVariable 's' e.Index) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'SLeft'><GenPattern
e.Pattern-B (TkVariable 's' e.Index) (LeftPtr s.Num) e.Pattern-E
(e.Vars (1 's' e.Index)) (e.Commands (CmdVar AlgLeft s.Num 's' e.Index))
>;
e.Pattern-B (LeftPtr s.Num) (TkVariable 't' e.Index) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'TLeft'><GenPattern
e.Pattern-B (TkVariable 't' e.Index) (LeftPtr s.Num) e.Pattern-E
(e.Vars (1 't' e.Index)) (e.Commands (CmdVar AlgLeft s.Num 't' e.Index))
>;
e.Pattern-B (TkVariable 's' e.Index) (RightPtr s.Num) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'SRight'><GenPattern
e.Pattern-B (RightPtr s.Num) (TkVariable 's' e.Index) e.Pattern-E
(e.Vars (1 's' e.Index)) (e.Commands (CmdVar AlgRight s.Num 's' e.Index))
>;
e.Pattern-B (TkVariable 't' e.Index) (RightPtr s.Num) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'TRight'><GenPattern
e.Pattern-B (RightPtr s.Num) (TkVariable 't' e.Index) e.Pattern-E
(e.Vars (1 't' e.Index)) (e.Commands (CmdVar AlgRight s.Num 't' e.Index))
>;
e.Pattern-B (LeftPtr s.Num) (TkVariable 'e' e.Index) e.Pattern-E
(e.Vars) (e.Commands) =
<WriteLine 'openedELeft'><GenPattern
e.Pattern-B (TkVariable 'e' e.Index) (LeftPtr s.Num) e.Pattern-E
(e.Vars (1 'e' e.Index))
(e.Commands (CmdOpenedE AlgLeft s.Num 'e' e.Index))
>;
// Завершение разбора. Все указатели аннигилировали.
e.Pattern (e.Vars) (e.Commands) =
(e.Vars)
((CmdComment <TextFromPattern e.Pattern> )
<SaveBrackets e.Commands >
);
}