Многострочные строковые литералы

This commit is contained in:
Mikhalkovich Stanislav 2024-03-21 21:21:59 +03:00
parent 6f158a6bef
commit c66bfa7d92
15 changed files with 2332 additions and 2215 deletions

View file

@ -1135,9 +1135,18 @@ namespace CodeFormatters
int pos = GetPosition(_string_const.source_context.begin_position.line_num, _string_const.source_context.begin_position.column_num); int pos = GetPosition(_string_const.source_context.begin_position.line_num, _string_const.source_context.begin_position.column_num);
if (Text[pos] == '$') if (Text[pos] == '$')
sb.Append('$'); sb.Append('$');
sb.Append("'"); if (_string_const.IsMultiline)
sb.Append(_string_const.Value.Replace("'","''")); {
sb.Append("'"); //sb.Append("'''");
sb.Append(_string_const.Value);
//sb.Append("'''");
}
else
{
sb.Append("'");
sb.Append(_string_const.Value.Replace("'", "''"));
sb.Append("'");
}
} }
public override void visit(expression_list _expression_list) public override void visit(expression_list _expression_list)

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3"; public const string Major = "3";
public const string Minor = "9"; public const string Minor = "9";
public const string Build = "0"; public const string Build = "0";
public const string Revision = "3438"; public const string Revision = "3439";
public const string MainVersion = Major + "." + Minor; public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3438
%MINOR%=9 %MINOR%=9
%REVISION%=3439
%COREVERSION%=0
%MAJOR%=3 %MAJOR%=3

View file

@ -1,9 +1,9 @@
// //
// This CSharp output file generated by Gardens Point LEX // This CSharp output file generated by Gardens Point LEX
// Version: 1.1.3.301 // Version: 1.1.3.301
// Machine: DESKTOP-2BJCJ7I // Machine: DESKTOP-G8V08V4
// DateTime: 21.02.2024 20:44:02 // DateTime: 21.03.2024 20:00:51
// UserName: ibond // UserName: ?????????
// GPLEX input file <ABCPascal.lex> // GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource> // GPLEX frame file <embedded resource>
// //
@ -124,8 +124,8 @@ namespace GPPGParserScanner
enum Result {accept, noMatch, contextFound}; enum Result {accept, noMatch, contextFound};
const int maxAccept = 72; const int maxAccept = 74;
const int initial = 73; const int initial = 75;
const int eofNum = 0; const int eofNum = 0;
const int goStart = -1; const int goStart = -1;
const int INITIAL = 0; const int INITIAL = 0;
@ -177,19 +177,19 @@ public PT parsertools;
} }
}; };
static int[] startState = new int[] {73, 110, 111, 112, 112, 113, static int[] startState = new int[] {75, 117, 118, 119, 119, 120,
0}; 0};
#region TwoLevelCharacterMap #region TwoLevelCharacterMap
// //
// There are 51 equivalence classes // There are 52 equivalence classes
// There are 256 character sequence regions // There are 256 character sequence regions
// There are 47 tables, 12032 entries // There are 47 tables, 12032 entries
// //
static sbyte[] mLo0 = new sbyte[256] { static sbyte[] mLo0 = new sbyte[256] {
/* '\0' */ 5, 43, 5, 5, 5, 5, 5, 5, 5, 12, 0, 5, 5, 6, 5, 5, /* '\0' */ 5, 43, 5, 5, 5, 5, 5, 5, 5, 12, 0, 5, 5, 6, 5, 5,
/* '\x10' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, /* '\x10' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\x20' */ 12, 5, 5, 11, 4, 5, 13, 50, 7, 9, 8, 24, 14, 25, 16, 1, /* '\x20' */ 51, 5, 5, 11, 4, 5, 13, 50, 7, 9, 8, 24, 14, 25, 16, 1,
/* '0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 15, 17, 27, 23, 26, 20, /* '0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 15, 17, 27, 23, 26, 20,
/* '@' */ 22, 48, 46, 48, 48, 49, 48, 44, 44, 47, 44, 44, 44, 44, 44, 44, /* '@' */ 22, 48, 46, 48, 48, 49, 48, 44, 44, 47, 44, 44, 44, 44, 44, 44,
/* 'P' */ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 18, 29, 19, 28, 21, /* 'P' */ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 18, 29, 19, 28, 21,
@ -1008,7 +1008,7 @@ public PT parsertools;
#region CompressedCharacterMap #region CompressedCharacterMap
// //
// There are 51 equivalence classes // There are 52 equivalence classes
// There are 21 character sequence regions // There are 21 character sequence regions
// There are 6 tables, 1255 entries // There are 6 tables, 1255 entries
// There are 15 runs, 0 singletons // There are 15 runs, 0 singletons
@ -1177,64 +1177,64 @@ public PT parsertools;
return MapC(code); return MapC(code);
} }
static Table[] NxS = new Table[115] { static Table[] NxS = new Table[122] {
/* NxS[ 0] */ new Table(0, 0, 0, null), /* NxS[ 0] */ new Table(0, 0, 0, null),
/* NxS[ 1] */ new Table(1, 23, -1, new sbyte[] {61, -1, -1, -1, -1, -1, /* NxS[ 1] */ new Table(1, 23, -1, new sbyte[] {63, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
62}), 64}),
/* NxS[ 2] */ new Table(0, 0, -1, null), /* NxS[ 2] */ new Table(0, 0, -1, null),
/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {109}), /* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {116}),
/* NxS[ 4] */ new Table(31, 20, -1, new sbyte[] {58, -1, -1, -1, -1, -1, /* NxS[ 4] */ new Table(31, 20, -1, new sbyte[] {60, -1, -1, -1, -1, -1,
-1, -1, -1, 58, -1, -1, -1, -1, 58, 58, -1, 58, 58, 108}), -1, -1, -1, 60, -1, -1, -1, -1, 60, 60, -1, 60, 60, 115}),
/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {57}), /* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {59}),
/* NxS[ 6] */ new Table(8, 16, -1, new sbyte[] {55, -1, -1, -1, -1, -1, /* NxS[ 6] */ new Table(8, 16, -1, new sbyte[] {57, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 56}), -1, -1, -1, -1, -1, -1, -1, -1, -1, 58}),
/* NxS[ 7] */ new Table(0, 0, -1, null), /* NxS[ 7] */ new Table(0, 0, -1, null),
/* NxS[ 8] */ new Table(0, 0, -1, null), /* NxS[ 8] */ new Table(0, 0, -1, null),
/* NxS[ 9] */ new Table(43, 39, 51, new sbyte[] {-1, 51, 52, 51, 51, 51, /* NxS[ 9] */ new Table(11, 39, -1, new sbyte[] {113, -1, -1, -1, -1, -1,
51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 106, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, 53,
-1, -1, -1, -1, -1, -1, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, -1, 53, 54, 53, 53, 53,
-1}), 53}),
/* NxS[ 10] */ new Table(21, 29, -1, new sbyte[] {28, -1, -1, -1, -1, -1, /* NxS[ 10] */ new Table(21, 29, -1, new sbyte[] {28, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -1, -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-1, 28, -1, 28, 28, 28, 28}), -1, 28, -1, 28, 28, 28, 28}),
/* NxS[ 11] */ new Table(0, 0, -1, null), /* NxS[ 11] */ new Table(0, 0, -1, null),
/* NxS[ 12] */ new Table(23, 1, -1, new sbyte[] {50}), /* NxS[ 12] */ new Table(23, 1, -1, new sbyte[] {52}),
/* NxS[ 13] */ new Table(16, 1, -1, new sbyte[] {49}), /* NxS[ 13] */ new Table(16, 1, -1, new sbyte[] {51}),
/* NxS[ 14] */ new Table(0, 0, -1, null), /* NxS[ 14] */ new Table(0, 0, -1, null),
/* NxS[ 15] */ new Table(0, 0, -1, null), /* NxS[ 15] */ new Table(0, 0, -1, null),
/* NxS[ 16] */ new Table(0, 0, -1, null), /* NxS[ 16] */ new Table(0, 0, -1, null),
/* NxS[ 17] */ new Table(16, 5, -1, new sbyte[] {46, -1, 47, -1, 48}), /* NxS[ 17] */ new Table(16, 5, -1, new sbyte[] {48, -1, 49, -1, 50}),
/* NxS[ 18] */ new Table(21, 29, -1, new sbyte[] {28, -1, -1, -1, -1, -1, /* NxS[ 18] */ new Table(21, 29, -1, new sbyte[] {28, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -1, -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-1, 28, 28, 28, 28, 28, 28}), -1, 28, 28, 28, 28, 28, 28}),
/* NxS[ 19] */ new Table(0, 0, -1, null), /* NxS[ 19] */ new Table(0, 0, -1, null),
/* NxS[ 20] */ new Table(0, 0, -1, null), /* NxS[ 20] */ new Table(0, 0, -1, null),
/* NxS[ 21] */ new Table(23, 1, -1, new sbyte[] {45}), /* NxS[ 21] */ new Table(23, 1, -1, new sbyte[] {47}),
/* NxS[ 22] */ new Table(23, 4, -1, new sbyte[] {43, -1, -1, 44}), /* NxS[ 22] */ new Table(23, 4, -1, new sbyte[] {45, -1, -1, 46}),
/* NxS[ 23] */ new Table(23, 1, -1, new sbyte[] {42}), /* NxS[ 23] */ new Table(23, 1, -1, new sbyte[] {44}),
/* NxS[ 24] */ new Table(23, 5, -1, new sbyte[] {37, -1, -1, 38, 79}), /* NxS[ 24] */ new Table(23, 5, -1, new sbyte[] {39, -1, -1, 40, 86}),
/* NxS[ 25] */ new Table(0, 0, -1, null), /* NxS[ 25] */ new Table(0, 0, -1, null),
/* NxS[ 26] */ new Table(7, 1, -1, new sbyte[] {36}), /* NxS[ 26] */ new Table(7, 1, -1, new sbyte[] {38}),
/* NxS[ 27] */ new Table(0, 0, -1, null), /* NxS[ 27] */ new Table(0, 0, -1, null),
/* NxS[ 28] */ new Table(21, 29, -1, new sbyte[] {28, -1, -1, -1, -1, -1, /* NxS[ 28] */ new Table(21, 29, -1, new sbyte[] {28, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -1, -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-1, 28, 28, 28, 28, 28, 28}), -1, 28, 28, 28, 28, 28, 28}),
/* NxS[ 29] */ new Table(0, 0, -1, null), /* NxS[ 29] */ new Table(0, 0, -1, null),
/* NxS[ 30] */ new Table(16, 34, -1, new sbyte[] {75, -1, -1, -1, -1, 30, /* NxS[ 30] */ new Table(16, 34, -1, new sbyte[] {82, -1, -1, -1, -1, 30,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 30, 77, -1, -1, 76}), -1, -1, -1, -1, -1, -1, -1, 30, 84, -1, -1, 83}),
/* NxS[ 31] */ new Table(50, 2, 74, new sbyte[] {32, -1}), /* NxS[ 31] */ new Table(50, 3, 76, new sbyte[] {32, 76, -1}),
/* NxS[ 32] */ new Table(50, 1, -1, new sbyte[] {74}), /* NxS[ 32] */ new Table(50, 1, -1, new sbyte[] {77}),
/* NxS[ 33] */ new Table(0, 0, -1, null), /* NxS[ 33] */ new Table(50, 1, -1, new sbyte[] {76}),
/* NxS[ 34] */ new Table(21, 25, -1, new sbyte[] {34, -1, -1, -1, -1, -1, /* NxS[ 34] */ new Table(0, 0, -1, null),
/* NxS[ 35] */ new Table(0, 0, -1, null),
/* NxS[ 36] */ new Table(21, 25, -1, new sbyte[] {36, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 34}), -1, -1, 36}),
/* NxS[ 35] */ new Table(21, 29, -1, new sbyte[] {35, -1, -1, -1, -1, -1, /* NxS[ 37] */ new Table(21, 29, -1, new sbyte[] {37, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 35, -1, -1, -1, 76}), -1, -1, 37, -1, -1, -1, 83}),
/* NxS[ 36] */ new Table(0, 0, -1, null),
/* NxS[ 37] */ new Table(0, 0, -1, null),
/* NxS[ 38] */ new Table(0, 0, -1, null), /* NxS[ 38] */ new Table(0, 0, -1, null),
/* NxS[ 39] */ new Table(0, 0, -1, null), /* NxS[ 39] */ new Table(0, 0, -1, null),
/* NxS[ 40] */ new Table(0, 0, -1, null), /* NxS[ 40] */ new Table(0, 0, -1, null),
@ -1248,87 +1248,95 @@ public PT parsertools;
/* NxS[ 48] */ new Table(0, 0, -1, null), /* NxS[ 48] */ new Table(0, 0, -1, null),
/* NxS[ 49] */ new Table(0, 0, -1, null), /* NxS[ 49] */ new Table(0, 0, -1, null),
/* NxS[ 50] */ new Table(0, 0, -1, null), /* NxS[ 50] */ new Table(0, 0, -1, null),
/* NxS[ 51] */ new Table(21, 29, -1, new sbyte[] {51, -1, -1, -1, -1, -1, /* NxS[ 51] */ new Table(0, 0, -1, null),
-1, -1, -1, -1, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, /* NxS[ 52] */ new Table(0, 0, -1, null),
-1, 51, 51, 51, 51, 51, 51}), /* NxS[ 53] */ new Table(21, 29, -1, new sbyte[] {53, -1, -1, -1, -1, -1,
/* NxS[ 52] */ new Table(45, 1, -1, new sbyte[] {52}), -1, -1, -1, -1, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
/* NxS[ 53] */ new Table(0, 13, -1, new sbyte[] {53, -1, -1, -1, -1, -1, -1, 53, 53, 53, 53, 53, 53}),
53, -1, -1, -1, -1, -1, 53}), /* NxS[ 54] */ new Table(45, 1, -1, new sbyte[] {54}),
/* NxS[ 54] */ new Table(0, 13, -1, new sbyte[] {54, -1, -1, -1, -1, -1, /* NxS[ 55] */ new Table(51, 14, -1, new sbyte[] {55, 55, -1, -1, -1, -1,
54, -1, -1, -1, -1, -1, 54}), -1, 55, -1, -1, -1, -1, -1, 55}),
/* NxS[ 55] */ new Table(0, 0, -1, null), /* NxS[ 56] */ new Table(51, 14, -1, new sbyte[] {56, 56, -1, -1, -1, -1,
/* NxS[ 56] */ new Table(0, 0, -1, null), -1, 56, -1, -1, -1, -1, -1, 56}),
/* NxS[ 57] */ new Table(0, 0, -1, null), /* NxS[ 57] */ new Table(0, 0, -1, null),
/* NxS[ 58] */ new Table(21, 29, -1, new sbyte[] {58, -1, -1, -1, -1, -1, /* NxS[ 58] */ new Table(0, 0, -1, null),
-1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, /* NxS[ 59] */ new Table(0, 0, -1, null),
-1, -1, 58, 58, -1, 58, 58}), /* NxS[ 60] */ new Table(21, 29, -1, new sbyte[] {60, -1, -1, -1, -1, -1,
/* NxS[ 59] */ new Table(50, 1, -1, new sbyte[] {108}), -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, -1, -1, -1, 60, -1, -1,
/* NxS[ 60] */ new Table(0, 0, -1, null), -1, -1, 60, 60, -1, 60, 60}),
/* NxS[ 61] */ new Table(0, 7, 61, new sbyte[] {-1, 61, 61, 61, 61, 61, /* NxS[ 61] */ new Table(50, 1, -1, new sbyte[] {115}),
-1}),
/* NxS[ 62] */ new Table(0, 0, -1, null), /* NxS[ 62] */ new Table(0, 0, -1, null),
/* NxS[ 63] */ new Table(0, 0, -1, null), /* NxS[ 63] */ new Table(0, 7, 63, new sbyte[] {-1, 63, 63, 63, 63, 63,
-1}),
/* NxS[ 64] */ new Table(0, 0, -1, null), /* NxS[ 64] */ new Table(0, 0, -1, null),
/* NxS[ 65] */ new Table(0, 0, -1, null), /* NxS[ 65] */ new Table(0, 0, -1, null),
/* NxS[ 66] */ new Table(9, 1, -1, new sbyte[] {67}), /* NxS[ 66] */ new Table(0, 0, -1, null),
/* NxS[ 67] */ new Table(0, 0, -1, null), /* NxS[ 67] */ new Table(0, 0, -1, null),
/* NxS[ 68] */ new Table(0, 0, -1, null), /* NxS[ 68] */ new Table(9, 1, -1, new sbyte[] {69}),
/* NxS[ 69] */ new Table(1, 1, -1, new sbyte[] {72}), /* NxS[ 69] */ new Table(0, 0, -1, null),
/* NxS[ 70] */ new Table(4, 1, -1, new sbyte[] {114}), /* NxS[ 70] */ new Table(0, 0, -1, null),
/* NxS[ 71] */ new Table(0, 0, -1, null), /* NxS[ 71] */ new Table(1, 1, -1, new sbyte[] {74}),
/* NxS[ 72] */ new Table(0, 7, 72, new sbyte[] {-1, 72, 72, 72, 72, 72, /* NxS[ 72] */ new Table(4, 1, -1, new sbyte[] {121}),
/* NxS[ 73] */ new Table(0, 0, -1, null),
/* NxS[ 74] */ new Table(0, 7, 74, new sbyte[] {-1, 74, 74, 74, 74, 74,
-1}), -1}),
/* NxS[ 73] */ new Table(43, 39, 28, new sbyte[] {29, 28, 30, 28, 28, 28, /* NxS[ 75] */ new Table(43, 40, 28, new sbyte[] {29, 28, 30, 28, 28, 28,
28, 31, -1, 1, 2, 3, 4, 2, -1, 5, 6, 7, 8, 9, -1, 10, 28, 31, -1, -1, 1, 2, 3, 4, 2, -1, 5, 6, 7, 8, 9, -1,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
27}), 26, 27}),
/* NxS[ 74] */ new Table(50, 2, 74, new sbyte[] {32, -1}), /* NxS[ 76] */ new Table(50, 3, 76, new sbyte[] {33, 76, -1}),
/* NxS[ 75] */ new Table(45, 1, -1, new sbyte[] {35}), /* NxS[ 77] */ new Table(50, 9, 76, new sbyte[] {33, 77, 78, 76, 76, 76,
/* NxS[ 76] */ new Table(24, 22, -1, new sbyte[] {78, 78, -1, -1, -1, -1, 76, 76, 79}),
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34}), /* NxS[ 78] */ new Table(50, 1, 78, new sbyte[] {80}),
/* NxS[ 77] */ new Table(36, 12, -1, new sbyte[] {33, -1, -1, -1, -1, -1, /* NxS[ 79] */ new Table(50, 3, 76, new sbyte[] {33, 76, 78}),
-1, -1, -1, -1, -1, 33}), /* NxS[ 80] */ new Table(50, 1, 78, new sbyte[] {81}),
/* NxS[ 78] */ new Table(45, 1, -1, new sbyte[] {34}), /* NxS[ 81] */ new Table(50, 1, 78, new sbyte[] {34}),
/* NxS[ 79] */ new Table(31, 9, -1, new sbyte[] {80, -1, -1, -1, 81, -1, /* NxS[ 82] */ new Table(45, 1, -1, new sbyte[] {37}),
-1, -1, 82}), /* NxS[ 83] */ new Table(24, 22, -1, new sbyte[] {85, 85, -1, -1, -1, -1,
/* NxS[ 80] */ new Table(32, 1, -1, new sbyte[] {96}), -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36}),
/* NxS[ 81] */ new Table(39, 1, -1, new sbyte[] {87}), /* NxS[ 84] */ new Table(36, 12, -1, new sbyte[] {35, -1, -1, -1, -1, -1,
/* NxS[ 82] */ new Table(42, 1, -1, new sbyte[] {83}), -1, -1, -1, -1, -1, 35}),
/* NxS[ 83] */ new Table(33, 1, -1, new sbyte[] {84}), /* NxS[ 85] */ new Table(45, 1, -1, new sbyte[] {36}),
/* NxS[ 84] */ new Table(31, 1, -1, new sbyte[] {85}), /* NxS[ 86] */ new Table(31, 9, -1, new sbyte[] {87, -1, -1, -1, 88, -1,
/* NxS[ 85] */ new Table(26, 1, -1, new sbyte[] {86}), -1, -1, 89}),
/* NxS[ 86] */ new Table(26, 1, -1, new sbyte[] {39}), /* NxS[ 87] */ new Table(32, 1, -1, new sbyte[] {103}),
/* NxS[ 87] */ new Table(40, 1, -1, new sbyte[] {88}), /* NxS[ 88] */ new Table(39, 1, -1, new sbyte[] {94}),
/* NxS[ 88] */ new Table(39, 1, -1, new sbyte[] {89}), /* NxS[ 89] */ new Table(42, 1, -1, new sbyte[] {90}),
/* NxS[ 89] */ new Table(31, 1, -1, new sbyte[] {90}), /* NxS[ 90] */ new Table(33, 1, -1, new sbyte[] {91}),
/* NxS[ 90] */ new Table(41, 1, -1, new sbyte[] {91}),
/* NxS[ 91] */ new Table(31, 1, -1, new sbyte[] {92}), /* NxS[ 91] */ new Table(31, 1, -1, new sbyte[] {92}),
/* NxS[ 92] */ new Table(38, 1, -1, new sbyte[] {93}), /* NxS[ 92] */ new Table(26, 1, -1, new sbyte[] {93}),
/* NxS[ 93] */ new Table(39, 1, -1, new sbyte[] {94}), /* NxS[ 93] */ new Table(26, 1, -1, new sbyte[] {41}),
/* NxS[ 94] */ new Table(26, 1, -1, new sbyte[] {95}), /* NxS[ 94] */ new Table(40, 1, -1, new sbyte[] {95}),
/* NxS[ 95] */ new Table(26, 1, -1, new sbyte[] {40}), /* NxS[ 95] */ new Table(39, 1, -1, new sbyte[] {96}),
/* NxS[ 96] */ new Table(33, 1, -1, new sbyte[] {97}), /* NxS[ 96] */ new Table(31, 1, -1, new sbyte[] {97}),
/* NxS[ 97] */ new Table(34, 1, -1, new sbyte[] {98}), /* NxS[ 97] */ new Table(41, 1, -1, new sbyte[] {98}),
/* NxS[ 98] */ new Table(31, 1, -1, new sbyte[] {99}), /* NxS[ 98] */ new Table(31, 1, -1, new sbyte[] {99}),
/* NxS[ 99] */ new Table(35, 1, -1, new sbyte[] {100}), /* NxS[ 99] */ new Table(38, 1, -1, new sbyte[] {100}),
/* NxS[ 100] */ new Table(35, 1, -1, new sbyte[] {101}), /* NxS[ 100] */ new Table(39, 1, -1, new sbyte[] {101}),
/* NxS[ 101] */ new Table(36, 1, -1, new sbyte[] {102}), /* NxS[ 101] */ new Table(26, 1, -1, new sbyte[] {102}),
/* NxS[ 102] */ new Table(37, 1, -1, new sbyte[] {103}), /* NxS[ 102] */ new Table(26, 1, -1, new sbyte[] {42}),
/* NxS[ 103] */ new Table(38, 1, -1, new sbyte[] {104}), /* NxS[ 103] */ new Table(33, 1, -1, new sbyte[] {104}),
/* NxS[ 104] */ new Table(26, 1, -1, new sbyte[] {105}), /* NxS[ 104] */ new Table(34, 1, -1, new sbyte[] {105}),
/* NxS[ 105] */ new Table(26, 1, -1, new sbyte[] {41}), /* NxS[ 105] */ new Table(31, 1, -1, new sbyte[] {106}),
/* NxS[ 106] */ new Table(0, 13, -1, new sbyte[] {53, -1, -1, -1, -1, -1, /* NxS[ 106] */ new Table(35, 1, -1, new sbyte[] {107}),
53, -1, -1, -1, -1, 107, 53}), /* NxS[ 107] */ new Table(35, 1, -1, new sbyte[] {108}),
/* NxS[ 107] */ new Table(0, 13, -1, new sbyte[] {54, -1, -1, -1, -1, -1, /* NxS[ 108] */ new Table(36, 1, -1, new sbyte[] {109}),
54, -1, -1, -1, -1, -1, 54}), /* NxS[ 109] */ new Table(37, 1, -1, new sbyte[] {110}),
/* NxS[ 108] */ new Table(50, 2, 108, new sbyte[] {59, -1}), /* NxS[ 110] */ new Table(38, 1, -1, new sbyte[] {111}),
/* NxS[ 109] */ new Table(0, 7, 109, new sbyte[] {-1, 109, 60, 109, 109, 109, /* NxS[ 111] */ new Table(26, 1, -1, new sbyte[] {112}),
/* NxS[ 112] */ new Table(26, 1, -1, new sbyte[] {43}),
/* NxS[ 113] */ new Table(51, 14, -1, new sbyte[] {55, 55, -1, -1, -1, -1,
-1, 55, -1, -1, -1, -1, 114, 55}),
/* NxS[ 114] */ new Table(51, 14, -1, new sbyte[] {56, 56, -1, -1, -1, -1,
-1, 56, -1, -1, -1, -1, -1, 56}),
/* NxS[ 115] */ new Table(50, 3, 115, new sbyte[] {61, 115, -1}),
/* NxS[ 116] */ new Table(0, 7, 116, new sbyte[] {-1, 116, 62, 116, 116, 116,
-1}), -1}),
/* NxS[ 110] */ new Table(2, 1, 63, new sbyte[] {64}), /* NxS[ 117] */ new Table(2, 1, 65, new sbyte[] {66}),
/* NxS[ 111] */ new Table(8, 1, 65, new sbyte[] {66}), /* NxS[ 118] */ new Table(8, 1, 67, new sbyte[] {68}),
/* NxS[ 112] */ new Table(0, 0, -1, null), /* NxS[ 119] */ new Table(0, 0, -1, null),
/* NxS[ 113] */ new Table(1, 3, 68, new sbyte[] {69, 68, 70}), /* NxS[ 120] */ new Table(1, 3, 70, new sbyte[] {71, 70, 72}),
/* NxS[ 114] */ new Table(0, 7, 114, new sbyte[] {-1, 114, 71, 114, 114, 114, /* NxS[ 121] */ new Table(0, 7, 121, new sbyte[] {-1, 121, 73, 121, 121, 121,
-1}), -1}),
}; };
@ -1339,7 +1347,7 @@ int NextState() {
unchecked { unchecked {
int rslt; int rslt;
int idx = Map(code) - NxS[state].min; int idx = Map(code) - NxS[state].min;
if (idx < 0) idx += 51; if (idx < 0) idx += 52;
if ((uint)idx >= (uint)NxS[state].rng) rslt = NxS[state].dflt; if ((uint)idx >= (uint)NxS[state].rng) rslt = NxS[state].dflt;
else rslt = NxS[state].nxt[idx]; else rslt = NxS[state].nxt[idx];
return rslt; return rslt;
@ -2051,108 +2059,115 @@ yylval = new Union();
return (int)Tokens.tkInteger; return (int)Tokens.tkInteger;
break; break;
case 32: case 32:
case 33:
yylval = new Union(); yylval = new Union();
currentLexLocation = CurrentLexLocation; currentLexLocation = CurrentLexLocation;
yylval.stn = parsertools.create_string_const(yytext,currentLexLocation); yylval.stn = parsertools.create_string_const(yytext,currentLexLocation);
return (int)Tokens.tkStringLiteral; return (int)Tokens.tkStringLiteral;
break; break;
case 33: case 34:
yylval = new Union();
currentLexLocation = CurrentLexLocation;
yylval.stn = parsertools.create_multiline_string_const(yytext,currentLexLocation);
return (int)Tokens.tkMultilineStringLiteral;
break;
case 35:
yylval = new Union(); yylval = new Union();
currentLexLocation = CurrentLexLocation; currentLexLocation = CurrentLexLocation;
yylval.ex = parsertools.create_bigint_const(yytext,currentLexLocation); yylval.ex = parsertools.create_bigint_const(yytext,currentLexLocation);
return (int)Tokens.tkBigInteger; return (int)Tokens.tkBigInteger;
break; break;
case 34: case 36:
case 35: case 37:
yylval = new Union(); yylval = new Union();
currentLexLocation = CurrentLexLocation; currentLexLocation = CurrentLexLocation;
yylval.ex = parsertools.create_double_const(yytext,currentLexLocation); yylval.ex = parsertools.create_double_const(yytext,currentLexLocation);
return (int)Tokens.tkFloat; return (int)Tokens.tkFloat;
break; break;
case 36: case 38:
yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkBackSlashRoundOpen; yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkBackSlashRoundOpen;
break; break;
case 37: case 39:
yylval = new Union(); yylval.op = new op_type_node(Operators.LessEqual); return (int)Tokens.tkLowerEqual; yylval = new Union(); yylval.op = new op_type_node(Operators.LessEqual); return (int)Tokens.tkLowerEqual;
break; break;
case 38: case 40:
yylval = new Union(); yylval.op = new op_type_node(Operators.NotEqual); return (int)Tokens.tkNotEqual; yylval = new Union(); yylval.op = new op_type_node(Operators.NotEqual); return (int)Tokens.tkNotEqual;
break; break;
case 39: case 41:
return (int)Tokens.tkParseModeType; return (int)Tokens.tkParseModeType;
break; break;
case 40: case 42:
return (int)Tokens.tkParseModeStatement; return (int)Tokens.tkParseModeStatement;
break; break;
case 41: case 43:
return (int)Tokens.tkParseModeExpression; return (int)Tokens.tkParseModeExpression;
break; break;
case 42: case 44:
yylval = new Union(); yylval.op = new op_type_node(Operators.GreaterEqual); return (int)Tokens.tkGreaterEqual; yylval = new Union(); yylval.op = new op_type_node(Operators.GreaterEqual); return (int)Tokens.tkGreaterEqual;
break; break;
case 43: case 45:
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentSubtraction); return (int)Tokens.tkMinusEqual; yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentSubtraction); return (int)Tokens.tkMinusEqual;
break; break;
case 44: case 46:
yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow; yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow;
break; break;
case 45: case 47:
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentAddition); return (int)Tokens.tkPlusEqual; yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentAddition); return (int)Tokens.tkPlusEqual;
break; break;
case 46: case 48:
return (int)Tokens.tkQuestionPoint; return (int)Tokens.tkQuestionPoint;
break; break;
case 47: case 49:
return (int)Tokens.tkQuestionSquareOpen; return (int)Tokens.tkQuestionSquareOpen;
break; break;
case 48: case 50:
return (int)Tokens.tkDoubleQuestion; return (int)Tokens.tkDoubleQuestion;
break; break;
case 49: case 51:
return (int)Tokens.tkDotDot; return (int)Tokens.tkDotDot;
break; break;
case 50: case 52:
yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign; yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign;
break; break;
case 51: case 53:
yylval = new Union(); yylval = new Union();
yylval.id = new ident(yytext,CurrentLexLocation); yylval.id = new ident(yytext,CurrentLexLocation);
return (int)Tokens.tkDirectiveName; return (int)Tokens.tkDirectiveName;
break; break;
case 52: case 54:
yylval = new Union(); yylval = new Union();
currentLexLocation = CurrentLexLocation; currentLexLocation = CurrentLexLocation;
yylval.stn = parsertools.create_sharp_char_const(yytext,currentLexLocation); yylval.stn = parsertools.create_sharp_char_const(yytext,currentLexLocation);
return (int)Tokens.tkAsciiChar; return (int)Tokens.tkAsciiChar;
break; break;
case 53: case 55:
yylval = new Union(); yylval.ti = new token_info("##",CurrentLexLocation); return (int)Tokens.tkShortProgram; yylval = new Union(); yylval.ti = new token_info("##",CurrentLexLocation); return (int)Tokens.tkShortProgram;
break; break;
case 54: case 56:
yylval = new Union(); yylval.ti = new token_info("###",CurrentLexLocation); return (int)Tokens.tkShortSFProgram; yylval = new Union(); yylval.ti = new token_info("###",CurrentLexLocation); return (int)Tokens.tkShortSFProgram;
break; break;
case 55: case 57:
yylval = new Union(); yylval.op = new op_type_node(Operators.Power); return (int)Tokens.tkStarStar; yylval = new Union(); yylval.op = new op_type_node(Operators.Power); return (int)Tokens.tkStarStar;
break; break;
case 56: case 58:
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.tkMultEqual; yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.tkMultEqual;
break; break;
case 57: case 59:
BEGIN(COMMENT1); BEGIN(COMMENT1);
break; break;
case 58: case 60:
yylval = new Union(); yylval = new Union();
currentLexLocation = CurrentLexLocation; currentLexLocation = CurrentLexLocation;
yylval.ex = parsertools.create_hex_const(yytext,currentLexLocation); yylval.ex = parsertools.create_hex_const(yytext,currentLexLocation);
return (int)Tokens.tkHex; return (int)Tokens.tkHex;
break; break;
case 59: case 61:
yylval = new Union(); yylval = new Union();
currentLexLocation = CurrentLexLocation; currentLexLocation = CurrentLexLocation;
yylval.stn = parsertools.create_format_string_const(yytext,currentLexLocation); yylval.stn = parsertools.create_format_string_const(yytext,currentLexLocation);
return (int)Tokens.tkFormatStringLiteral; return (int)Tokens.tkFormatStringLiteral;
break; break;
case 60: case 62:
if (parsertools.build_tree_for_formatter) if (parsertools.build_tree_for_formatter)
break; break;
@ -2208,36 +2223,36 @@ if (parsertools.build_tree_for_formatter)
Defines.Remove(directiveparam); Defines.Remove(directiveparam);
} }
break; break;
case 61: case 63:
{ {
} }
break; break;
case 62: case 64:
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentDivision); return (int)Tokens.tkDivEqual; yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentDivision); return (int)Tokens.tkDivEqual;
break; break;
case 63:
{
}
break;
case 64:
BEGIN(INITIAL);
break;
case 65: case 65:
case 66:
{ {
} }
break; break;
case 66:
BEGIN(INITIAL);
break;
case 67: case 67:
BEGIN(INITIAL);
break;
case 68: case 68:
case 69:
case 70:
{ {
} }
break; break;
case 69:
BEGIN(INITIAL);
break;
case 70:
case 71: case 71:
case 72:
{
}
break;
case 73:
parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam); parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam);
parsertools.CheckDirectiveParams(directivename,directiveparam); // directivename in UPPERCASE! parsertools.CheckDirectiveParams(directivename,directiveparam); // directivename in UPPERCASE!
if (directivename == "IFDEF") if (directivename == "IFDEF")
@ -2284,7 +2299,7 @@ parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam);
parsertools.compilerDirectives.RemoveAt(ind_to_remove); parsertools.compilerDirectives.RemoveAt(ind_to_remove);
} }
break; break;
case 72: case 74:
{ {
} }

View file

@ -38,6 +38,7 @@ BIGINTNUM {INTNUM}[bB][iI]
FLOATNUM {INTNUM}\.{INTNUM} FLOATNUM {INTNUM}\.{INTNUM}
EXPNUM ({INTNUM}\.)?{INTNUM}[eE][+\-]?{INTNUM} EXPNUM ({INTNUM}\.)?{INTNUM}[eE][+\-]?{INTNUM}
STRINGNUM \'([^\'\n]|\'\')*\' STRINGNUM \'([^\'\n]|\'\')*\'
MULTILINESTRINGNUM \'\'\'[ ]*\r?\n([^']|\'[^']|\'\'[^'])*\'\'\'
FORMATSTRINGNUM \$\'([^\'\n]|\'\')*\' FORMATSTRINGNUM \$\'([^\'\n]|\'\')*\'
HEXNUM ${HexDigit}{HexDigit_}* HEXNUM ${HexDigit}{HexDigit_}*
SHARPCHARNUM #{Digit}+ SHARPCHARNUM #{Digit}+
@ -491,6 +492,13 @@ UNICODEARROW \x890
return (int)Tokens.tkStringLiteral; return (int)Tokens.tkStringLiteral;
} }
{MULTILINESTRINGNUM} {
yylval = new Union();
currentLexLocation = CurrentLexLocation;
yylval.stn = parsertools.create_multiline_string_const(yytext,currentLexLocation);
return (int)Tokens.tkMultilineStringLiteral;
}
{FORMATSTRINGNUM} { {FORMATSTRINGNUM} {
yylval = new Union(); yylval = new Union();
currentLexLocation = CurrentLexLocation; currentLexLocation = CurrentLexLocation;

View file

@ -51,7 +51,7 @@
%token <op> tkAssign tkPlusEqual tkMinusEqual tkMultEqual tkDivEqual tkMinus tkPlus tkSlash tkStar tkStarStar tkEqual tkGreater tkGreaterEqual tkLower tkLowerEqual %token <op> tkAssign tkPlusEqual tkMinusEqual tkMultEqual tkDivEqual tkMinus tkPlus tkSlash tkStar tkStarStar tkEqual tkGreater tkGreaterEqual tkLower tkLowerEqual
%token <op> tkNotEqual tkCSharpStyleOr tkArrow tkOr tkXor tkAnd tkDiv tkMod tkShl tkShr tkNot tkAs tkIn tkIs tkImplicit tkExplicit tkAddressOf tkDeref %token <op> tkNotEqual tkCSharpStyleOr tkArrow tkOr tkXor tkAnd tkDiv tkMod tkShl tkShr tkNot tkAs tkIn tkIs tkImplicit tkExplicit tkAddressOf tkDeref
%token <id> tkDirectiveName tkIdentifier %token <id> tkDirectiveName tkIdentifier
%token <stn> tkStringLiteral tkFormatStringLiteral tkAsciiChar %token <stn> tkStringLiteral tkFormatStringLiteral tkMultilineStringLiteral tkAsciiChar
%token <id> tkAbstract tkForward tkOverload tkReintroduce tkOverride tkVirtual tkExtensionMethod %token <id> tkAbstract tkForward tkOverload tkReintroduce tkOverride tkVirtual tkExtensionMethod
%token <ex> tkInteger tkBigInteger tkFloat tkHex %token <ex> tkInteger tkBigInteger tkFloat tkHex
%token <id> tkUnknown %token <id> tkUnknown
@ -4502,6 +4502,19 @@ literal
$$ = NewFormatString($1 as string_const); $$ = NewFormatString($1 as string_const);
} }
} }
| tkMultilineStringLiteral
{
if (parsertools.build_tree_for_formatter)
{
var sc = $1 as string_const;
sc.IsMultiline = true;
$$ = sc;
}
else
{
$$ = NewLiteral(new literal_const_line($1 as literal, @$));
}
}
; ;
literal_list literal_list

View file

@ -7,6 +7,7 @@ using QUT.Gppg;
using GPPGParserScanner; using GPPGParserScanner;
using System; using System;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions;
namespace PascalABCSavParser namespace PascalABCSavParser
{ {
@ -459,6 +460,56 @@ namespace PascalABCSavParser
return lt; return lt;
} }
public literal create_multiline_string_const(string text, SourceContext sc)
{
if (build_tree_for_formatter)
{
literal lt1 = new string_const(text);
lt1.source_context = sc;
return lt1;
}
var NewLine = System.Environment.NewLine;
// Многострочная строка должна содержать как минимум два перехода на новую строку
// разобьём её по символам перехода на новую строку
//var ss = text.Split('\n');
text = text.Substring(3, text.Length - 6);
var ss = Regex.Split(text, System.Environment.NewLine);
// Если одна строка, то ошибка - MULTILINE_STRING_SHOULD_BE_PLACED_ON_SEVERAL_LINES
if (ss.Length == 1)
//this.AddErrorFromResource("MULTILINE_STRING_SHOULD_BE_PLACED_ON_SEVERAL_LINES", sc);
return create_string_const(text, sc);
// Проверим первую строку
ss[0] = ss[0].Trim();
if (ss[0].Length > 0)
// мы сюда точно не должны попасть. Это должна быть обычная строка!
this.AddErrorFromResource("IMPOSSIBLE_MULTILINE_ERROR", sc);
// Количество лидирующих пробелов в последней строке
var numspaces = ss[ss.Length-1].TakeWhile(Char.IsWhiteSpace).Count();
// Во всех строках от первой до предпоследней (если они есть) количество лидирующих пробелов должно быть не меньше чем в последней
// мультистрочная строка содержит несовместимые отступы
// MULTILINE_STRING_CONTAINS_INCONSISTENT_INDENTS
for (var i = 1; i < ss.Length - 1; i++)
if (ss[i].TakeWhile(Char.IsWhiteSpace).Count() < numspaces)
{
this.AddErrorFromResource("MULTILINE_STRING_CONTAINS_INCONSISTENT_INDENTS", sc);
break;
}
// Теперь удалить ровно такое количество пробелов в каждой строке с 1 по предпоследнюю
for (var i = 1; i < ss.Length - 1; i++)
ss[i] = ss[i].Remove(0, numspaces);
// Наконец, соберем text из всех строк с первой по предпоследнюю
var ll = ss.ToList();
ll.RemoveAt(0);
ll.RemoveAt(ll.Count - 1);
text = string.Join(NewLine, ll.ToArray());
literal lt = new string_const(text);
lt.source_context = sc;
return lt;
}
public literal create_format_string_const(string text, SourceContext sc) public literal create_format_string_const(string text, SourceContext sc)
{ {
literal lt; literal lt;

File diff suppressed because it is too large Load diff

View file

@ -372,5 +372,6 @@ script=

View file

@ -1 +1 @@
3.9.0.3438 3.9.0.3439

View file

@ -1 +1 @@
!define VERSION '3.9.0.3438' !define VERSION '3.9.0.3439'

View file

@ -628,6 +628,7 @@ namespace PascalABCCompiler.SyntaxTree
return "'" + Value + "'"; return "'" + Value + "'";
} }
public bool IsInterpolated = false; public bool IsInterpolated = false;
public bool IsMultiline = false;
} }
public partial class expression_list public partial class expression_list

View file

@ -4617,6 +4617,7 @@
<HelpData Key="statement_list.void Add(statement st, )" Value="" /> <HelpData Key="statement_list.void Add(statement st, )" Value="" />
<HelpData Key="statement_list.void Add(statement st, SourceContext sc)" Value="" /> <HelpData Key="statement_list.void Add(statement st, SourceContext sc)" Value="" />
<HelpData Key="string_const" Value="Строковая константа" /> <HelpData Key="string_const" Value="Строковая константа" />
<HelpData Key="string_const.IsMultiline" Value="" />
<HelpData Key="string_const.Value" Value="Значенеи строковой константы" /> <HelpData Key="string_const.Value" Value="Значенеи строковой константы" />
<HelpData Key="string_const.override string ToString()" Value="" /> <HelpData Key="string_const.override string ToString()" Value="" />
<HelpData Key="string_num_definition" Value="Представление для класса строки вида string[256]." /> <HelpData Key="string_num_definition" Value="Представление для класса строки вида string[256]." />

View file

@ -40,6 +40,7 @@ type
Slider = Slider; Slider = Slider;
ComboBox = ComboBox; ComboBox = ComboBox;
TextBlock = TextBlock; TextBlock = TextBlock;
Border = System.Windows.Controls.Border;
Rectangle = Rectangle; Rectangle = Rectangle;
DrawingVisual = DrawingVisual; DrawingVisual = DrawingVisual;

View file

@ -40,6 +40,7 @@ type
Slider = Slider; Slider = Slider;
ComboBox = ComboBox; ComboBox = ComboBox;
TextBlock = TextBlock; TextBlock = TextBlock;
Border = System.Windows.Controls.Border;
Rectangle = Rectangle; Rectangle = Rectangle;
DrawingVisual = DrawingVisual; DrawingVisual = DrawingVisual;