Skip to content

Commit

Permalink
Пример кода для сохранения позиций элементов образца (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mazdaywik committed Mar 24, 2016
1 parent 9d7128b commit a3b2d85
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 30 deletions.
24 changes: 24 additions & 0 deletions src/compiler/Generator.sref
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,11 @@ GenCommand {
<PrintMatchChar (e.Indent) s.Direction s.BracketNumber s.Char>
;

(e.Indent) (#CmdCharSave s.Offset s.Direction s.BracketNumber s.Char) =
(e.Indent)
<PrintMatchCharSave (e.Indent) s.Offset s.Direction s.BracketNumber s.Char>
;

(e.Indent) (#CmdNumber s.Direction s.BracketNumber s.Number) =
(e.Indent)
<PrintMatchNumber (e.Indent) s.Direction s.BracketNumber s.Number>
Expand Down Expand Up @@ -784,6 +789,25 @@ PrintMatch {
(e.Indent ' ' <BreakerFromIndent e.Indent>);
}

PrintMatchCharSave {
(e.Indent) s.Offset s.Direction s.BracketNumber s.Char =
<PrintMatchSave
(e.Indent) s.Offset s.Direction s.BracketNumber
('char') '' <Escape s.Char> ''
>;
}

PrintMatchSave {
(e.Indent) s.Offset s.Direction s.BracketNumber (e.Function) e.TextRep =
(e.Indent
<ContextItem s.Offset> ' = '
'refalrts::' e.Function '_' <StrFromDirection s.Direction>
'( ' e.TextRep ', ' <ContextRange s.BracketNumber> ' );'
)
(e.Indent 'if( ! ' <ContextItem s.Offset> ' )')
(e.Indent ' ' <BreakerFromIndent e.Indent>);
}

PrintAllocateElem {
(e.Indent) s.ElemNumber s.ElementType e.Info =
(e.Indent
Expand Down
30 changes: 12 additions & 18 deletions src/compiler/HightLevelRASL-OptPattern.sref
Original file line number Diff line number Diff line change
Expand Up @@ -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) =
<DoGenPattern
s.ContextOffset
<Inc s.ContextOffset>
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
Expand Down Expand Up @@ -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) =
<DoGenPattern
s.ContextOffset
<Inc s.ContextOffset>
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
Expand Down Expand Up @@ -667,8 +667,9 @@ TextFromPattern {
(#TkOpenADT) (#TkName e.Name) e.Tail = ' [' e.Name <TextFromPattern e.Tail>;
(#TkCloseADT) e.Tail = ' ]' <TextFromPattern e.Tail>;

(#TkChar s.Char) e.Tail =
' ' '' <TextFromPattern-Char (#TkChar s.Char) e.Tail>;
(#TkChar s.Char s.Offset) e.Tail =
' ''' <EscapeChar s.Char> '' <Offset s.Offset>
<TextFromPattern e.Tail>;

(#TkNumber s.Number) e.Tail =
' ' <StrFromInt s.Number> <TextFromPattern e.Tail>;
Expand All @@ -677,7 +678,7 @@ TextFromPattern {
' & ' e.Name <TextFromPattern e.Tail>;

(#TkVariable s.Mode e.Index s.Depth s.Offset) e.Tail =
' ' <PrintVar s.Mode e.Index s.Depth> '/' <StrFromInt s.Offset>
' ' <PrintVar s.Mode e.Index s.Depth> <Offset s.Offset>
<TextFromPattern e.Tail>;

(#TkIdentifier e.Name) e.Tail =
Expand All @@ -690,15 +691,8 @@ PrintVar {
s.Mode e.Index s.Depth = s.Mode '.' e.Index '#' <StrFromInt s.Depth>;
}

Escape {
s.Char = <EscapeChar s.Char>;
}

TextFromPattern-Char {
(#TkChar s.Char) e.Tail =
<Escape s.Char> <TextFromPattern-Char e.Tail>;

e.Other = '' <TextFromPattern e.Other>;
Offset {
s.Offset = '/' <StrFromInt s.Offset>;
}

//==============================================================================
Expand Down
3 changes: 3 additions & 0 deletions src/compiler/interfaces.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)` — соответствует однострочному комментарию
Expand Down
22 changes: 12 additions & 10 deletions src/srlib/refalrts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/srlib/refalrts.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down

0 comments on commit a3b2d85

Please sign in to comment.