From a3b2d85f7e18796f14978de0b5f2408b19a71f36 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, 24 Mar 2016 17:55:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=86=D0=B8=D0=B9=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D1=86=D0=B0?= =?UTF-8?q?=20(#16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compiler/Generator.sref | 24 +++++++++++++++++ src/compiler/HightLevelRASL-OptPattern.sref | 30 +++++++++------------ src/compiler/interfaces.md | 3 +++ src/srlib/refalrts.cpp | 22 ++++++++------- src/srlib/refalrts.h | 4 +-- 5 files changed, 53 insertions(+), 30 deletions(-) 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 );