diff --git a/src/compiler/Generator.sref b/src/compiler/Generator.sref index bf18f5ea..e99bc3b3 100644 --- a/src/compiler/Generator.sref +++ b/src/compiler/Generator.sref @@ -217,6 +217,11 @@ GenCommand { ; + (e.Indent) (#CmdCharSave s.Offset s.Direction s.BracketNumber s.Char) = + (e.Indent) + + ; + (e.Indent) (#CmdNumber s.Direction s.BracketNumber s.Number) = (e.Indent) @@ -784,6 +789,25 @@ PrintMatch { (e.Indent ' ' ); } +PrintMatchCharSave { + (e.Indent) s.Offset s.Direction s.BracketNumber s.Char = + '' + >; +} + +PrintMatchSave { + (e.Indent) s.Offset s.Direction s.BracketNumber (e.Function) e.TextRep = + (e.Indent + ' = ' + 'refalrts::' e.Function '_' + '( ' e.TextRep ', ' ' );' + ) + (e.Indent 'if( ! ' ' )') + (e.Indent ' ' ); +} + PrintAllocateElem { (e.Indent) s.ElemNumber s.ElementType e.Info = (e.Indent diff --git a/src/compiler/HightLevelRASL-OptPattern.sref b/src/compiler/HightLevelRASL-OptPattern.sref index ab833930..0230aab8 100644 --- a/src/compiler/HightLevelRASL-OptPattern.sref +++ b/src/compiler/HightLevelRASL-OptPattern.sref @@ -260,11 +260,11 @@ DoGenPattern { e.Ranges-B (#Junk e.Junk) (#Range s.Num (#TkChar s.Char) e.Range) e.Ranges-E (e.Vars) (e.Commands) = e.Ranges-B - (#Junk e.Junk (#TkChar s.Char)) (#Range s.Num e.Range) + (#Junk e.Junk (#TkChar s.Char s.ContextOffset)) (#Range s.Num e.Range) e.Ranges-E - (e.Vars) (e.Commands (#CmdChar #AlgLeft s.Num s.Char)) + (e.Vars) (e.Commands (#CmdCharSave s.ContextOffset #AlgLeft s.Num s.Char)) >; s.ContextOffset @@ -306,11 +306,11 @@ DoGenPattern { e.Ranges-B (#Range s.Num e.Range (#TkChar s.Char)) (#Junk e.Junk) e.Ranges-E (e.Vars) (e.Commands) = e.Ranges-B - (#Range s.Num e.Range) (#Junk (#TkChar s.Char) e.Junk) + (#Range s.Num e.Range) (#Junk (#TkChar s.Char s.ContextOffset) e.Junk) e.Ranges-E - (e.Vars) (e.Commands (#CmdChar #AlgRight s.Num s.Char)) + (e.Vars) (e.Commands (#CmdCharSave s.ContextOffset #AlgRight s.Num s.Char)) >; s.ContextOffset @@ -667,8 +667,9 @@ TextFromPattern { (#TkOpenADT) (#TkName e.Name) e.Tail = ' [' e.Name ; (#TkCloseADT) e.Tail = ' ]' ; - (#TkChar s.Char) e.Tail = - ' ' '' ; + (#TkChar s.Char s.Offset) e.Tail = + ' ''' '' + ; (#TkNumber s.Number) e.Tail = ' ' ; @@ -677,7 +678,7 @@ TextFromPattern { ' & ' e.Name ; (#TkVariable s.Mode e.Index s.Depth s.Offset) e.Tail = - ' ' '/' + ' ' ; (#TkIdentifier e.Name) e.Tail = @@ -690,15 +691,8 @@ PrintVar { s.Mode e.Index s.Depth = s.Mode '.' e.Index '#' ; } -Escape { - s.Char = ; -} - -TextFromPattern-Char { - (#TkChar s.Char) e.Tail = - ; - - e.Other = '' ; +Offset { + s.Offset = '/' ; } //============================================================================== diff --git a/src/compiler/interfaces.md b/src/compiler/interfaces.md index fa4dd89f..02a952d6 100644 --- a/src/compiler/interfaces.md +++ b/src/compiler/interfaces.md @@ -171,6 +171,7 @@ | #CmdRepeated s.Mode s.VarOffset s.SampleOffset | #CmdEmpty | #CmdVar s.Mode s.VarOffset + | #CmdCharSave s.Offset s.Char s.Direction ::= #AlgLeft | #AlgRight @@ -247,6 +248,8 @@ * `#CmdEmpty` — этот диапазон должен быть пустым. Поле `s.Direction` игнорируется (обычно передаётся `#AlgLeft`). * `#CmdVar s.Mode s.VarOffset` — сопоставление с s- или t-переменной. + * `#Cmd****Save s.Offset e.Info` — аналогично без `Save`, но они + сохраняют сопоставленный элемент на контексте по смещению `s.Offset`. * `(#CmdSave s.OldOffset s.NewOffset)` — копирование границ диапазона `s.OldOffset` в `s.NewOffset`. * `(#CmdComment e.Text)` — соответствует однострочному комментарию diff --git a/src/srlib/refalrts.cpp b/src/srlib/refalrts.cpp index ac2d9ada..db2c6d4c 100644 --- a/src/srlib/refalrts.cpp +++ b/src/srlib/refalrts.cpp @@ -150,37 +150,39 @@ bool refalrts::function_right( } } -bool refalrts::char_left( +refalrts::Iter refalrts::char_left( char ch, refalrts::Iter& first, refalrts::Iter& last ) { assert( (first == 0) == (last == 0) ); if( empty_seq( first, last ) ) { - return false; + return 0; } else if ( cDataChar != first->tag ) { - return false; + return 0; } else if ( first->char_info != ch ) { - return false; + return 0; } else { + Iter char_pos = first; move_left( first, last ); - return true; + return char_pos; } } -bool refalrts::char_right( +refalrts::Iter refalrts::char_right( char ch, refalrts::Iter& first, refalrts::Iter& last ) { assert( (first == 0) == (last == 0) ); if( empty_seq( first, last ) ) { - return false; + return 0; } else if ( cDataChar != last->tag ) { - return false; + return 0; } else if ( last->char_info != ch ) { - return false; + return 0; } else { + Iter char_pos = last; move_right( first, last ); - return true; + return char_pos; } } diff --git a/src/srlib/refalrts.h b/src/srlib/refalrts.h index bb2ce46a..04b9eb30 100644 --- a/src/srlib/refalrts.h +++ b/src/srlib/refalrts.h @@ -161,8 +161,8 @@ extern bool empty_seq( Iter begin, Iter end ); extern bool function_left( RefalFunctionPtr func, Iter& first, Iter& last ); extern bool function_right( RefalFunctionPtr func, Iter& first, Iter& last ); -extern bool char_left( char ch, Iter& first, Iter& last ); -extern bool char_right( char ch, Iter& first, Iter& last ); +extern Iter char_left( char ch, Iter& first, Iter& last ); +extern Iter char_right( char ch, Iter& first, Iter& last ); extern bool number_left( RefalNumber num, Iter& first, Iter& last ); extern bool number_right( RefalNumber num, Iter& first, Iter& last );