Skip to content

Commit

Permalink
Рефакторинг TypeSingleQuoted (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mazdaywik committed May 11, 2016
1 parent 7c7501d commit e49f4e5
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 38 deletions.
76 changes: 39 additions & 37 deletions Sources/Compiler/BE-Refal5/MExeTyper.mref
Original file line number Diff line number Diff line change
Expand Up @@ -127,32 +127,32 @@ TypeCharWithSpaceAfter {
}

/**
<TypeSingleQuoted t.ExeTyper s.Quote e.Text> == t.ExeTyper
<TypeSingleQuoted t.ExeTyper e.Text> == t.ExeTyper
*/
$ENTRY TypeSingleQuoted {
[ExeTyper s.Limit Limit t.FOut e.Converted] s.Quote e.Text =
[ExeTyper s.Limit Limit t.FOut e.Converted] e.Text =
<TypeSingleQuoted
[ExeTyper s.Limit s.Limit <FileIO::WriteLine t.FOut e.Converted>]
s.Quote e.Text
e.Text
>;

// Склеиваем две соседние строки в кавычках
[ExeTyper s.Limit s.Free t.FOut e.Converted s.Quote ' ']
s.Quote e.Text =
[ExeTyper s.Limit s.Free t.FOut e.Converted ''' ']
e.Text =
<DoTypeSingleQuoted
[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Quote e.Text
[ExeTyper s.Limit s.Free t.FOut e.Converted] e.Text
>;

// Удаляем пробел перед кавычкой
[ExeTyper s.Limit s.Free t.FOut e.Converted ' '] s.Quote e.Text =
[ExeTyper s.Limit s.Free t.FOut e.Converted ' '] e.Text =
<TypeSingleQuoted
[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Quote e.Text
[ExeTyper s.Limit s.Free t.FOut e.Converted] e.Text
>;

[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Quote e.Text =
[ExeTyper s.Limit s.Free t.FOut e.Converted] e.Text =
<DoTypeSingleQuoted
[ExeTyper s.Limit <Dec2 s.Free> t.FOut e.Converted s.Quote]
s.Quote e.Text
[ExeTyper s.Limit <Dec2 s.Free> t.FOut e.Converted '']
e.Text
>;
}

Expand All @@ -162,90 +162,92 @@ DoTypeSingleQuoted {
за исключением случая символа x, т.к. нельзя разрывать
шестнадцатиричный символ.
*/
[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Quote '\\x' s.Num1 s.Num2 e.Tail =
[ExeTyper s.Limit s.Free t.FOut e.Converted] '\\x' s.Num1 s.Num2 e.Tail =
<DoTypeSingleQuoted
[ExeTyper
s.Limit
<Dec2 s.Free>
t.FOut e.Converted '\\x' s.Num1 s.Num2
]
s.Quote e.Tail
e.Tail
>;

[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Quote '\\' s.Escaped e.Tail =
[ExeTyper s.Limit s.Free t.FOut e.Converted] '\\' s.Escaped e.Tail =
<DoTypeSingleQuoted
[ExeTyper
s.Limit
<Dec2 s.Free>
t.FOut e.Converted '\\' s.Escaped
]
s.Quote e.Tail
e.Tail
>;

/* Обрабатываем $ */
[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Quote '$$' e.Tail =
[ExeTyper s.Limit s.Free t.FOut e.Converted] '$$' e.Tail =
<DoTypeSingleQuoted
[ExeTyper s.Limit <Dec s.Free> t.FOut e.Converted '$'] s.Quote e.Tail
[ExeTyper s.Limit <Dec s.Free> t.FOut e.Converted '$'] e.Tail
>;

/* Необходимо разрезать текст в кавычках таким образом, чтобы на отдель-
ной строке не осталось '' или "". */
ной строке не осталось ''. */

// Строка заканчивается на \', печатаемый текст закончился -- печатаем \''
[ExeTyper s.Limit Limit t.FOut e.Converted '\\' s.Quote] s.Quote =
[ExeTyper s.Limit Limit t.FOut e.Converted '\\' ''] =
[ExeTyper
s.Limit s.Limit
<FileIO::WriteLine t.FOut e.Converted '\\' s.Quote s.Quote>
<FileIO::WriteLine t.FOut e.Converted '\\' '' ''>
];

// Строка заканчивается на \' и осталась ещё длинная строка.
// Предыдущую строку заканчиваем \'', а на новой печатаем текст в кавычках.
[ExeTyper s.Limit Limit t.FOut e.Converted '\\' s.Quote] s.Quote e.Text =
[ExeTyper s.Limit Limit t.FOut e.Converted '\\' ''] e.Text =
<TypeSingleQuoted
[ExeTyper
s.Limit s.Limit
<FileIO::WriteLine t.FOut e.Converted '\\' s.Quote s.Quote>
] s.Quote e.Text
<FileIO::WriteLine t.FOut e.Converted '\\' '' ''>
]
e.Text
>;

// Неожиданно закончилась строка
[ExeTyper s.Limit Limit t.FOut e.Converted s.Quote] s.Quote =
[ExeTyper s.Limit Limit t.FOut e.Converted ''] =
<MError::LinkError
'Unexpected quote position ??? `' e.Converted s.Quote '`'
'Unexpected quote position ??? `' e.Converted '' '`'
>;

[ExeTyper s.Limit Limit t.FOut e.Converted s.Quote] s.Quote e.Text =
// ВНИМАНИЕ! DoTypeSingleQuoted!
[ExeTyper s.Limit Limit t.FOut e.Converted ''] e.Text =
// ВНИМАНИЕ! Не DoTypeSingleQuoted!
<TypeSingleQuoted
[ExeTyper
s.Limit s.Limit
<FileIO::WriteLine t.FOut e.Converted>
] s.Quote e.Text
]
e.Text
>;

// Закончилась строка и закончился текст в кавычках
[ExeTyper s.Limit Limit t.FOut e.Converted] s.Quote =
[ExeTyper s.Limit Limit t.FOut e.Converted] =
[ExeTyper
s.Limit s.Limit
<FileIO::WriteLine t.FOut e.Converted s.Quote>
<FileIO::WriteLine t.FOut e.Converted ''>
];

// Закончилась строка, текст в кавычках остался
[ExeTyper s.Limit Limit t.FOut e.Converted] s.Quote e.Text =
[ExeTyper s.Limit Limit t.FOut e.Converted] e.Text =
// ВНИМАНИЕ! Не DoTypeSingleQuoted!
<TypeSingleQuoted
[ExeTyper s.Limit Limit t.FOut e.Converted s.Quote]
s.Quote e.Text
[ExeTyper s.Limit Limit t.FOut e.Converted '']
e.Text
>;

/* Штатные случаи */
[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Quote =
[ExeTyper s.Limit <Dec s.Free> t.FOut e.Converted s.Quote ' '];
[ExeTyper s.Limit s.Free t.FOut e.Converted] =
[ExeTyper s.Limit <Dec s.Free> t.FOut e.Converted '' ' '];

[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Quote s.Char e.Text =
[ExeTyper s.Limit s.Free t.FOut e.Converted] s.Char e.Text =
<DoTypeSingleQuoted
[ExeTyper s.Limit <Dec s.Free> t.FOut e.Converted s.Char]
s.Quote e.Text
e.Text
>;
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/Compiler/BE-Refal5/MLinker.mref
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ TypeLine {
t.UnitStorage t.Aliases t.ExeTyper ('' e.HiddenQuote) e.Raw =
<TypeLine
t.UnitStorage t.Aliases
<MExeTyper::TypeSingleQuoted t.ExeTyper '' e.HiddenQuote>
<MExeTyper::TypeSingleQuoted t.ExeTyper e.HiddenQuote>
e.Raw
>;

Expand Down

0 comments on commit e49f4e5

Please sign in to comment.