Add: ??, integer? and semantic checks for ?.
This commit is contained in:
parent
09323f7945
commit
d6fd84b935
|
|
@ -1,9 +1,9 @@
|
|||
//
|
||||
// This CSharp output file generated by Gardens Point LEX
|
||||
// Version: 1.1.3.301
|
||||
// Machine: DESKTOP-8EAQPI9
|
||||
// DateTime: 01.06.2017 21:50:36
|
||||
// UserName: ?????????
|
||||
// Machine: JANE-MSI
|
||||
// DateTime: 03.06.2017 0:09:24
|
||||
// UserName: Jane
|
||||
// GPLEX input file <ABCPascal.lex>
|
||||
// GPLEX frame file <embedded resource>
|
||||
//
|
||||
|
|
@ -124,8 +124,8 @@ namespace GPPGParserScanner
|
|||
|
||||
enum Result {accept, noMatch, contextFound};
|
||||
|
||||
const int maxAccept = 63;
|
||||
const int initial = 64;
|
||||
const int maxAccept = 64;
|
||||
const int initial = 65;
|
||||
const int eofNum = 0;
|
||||
const int goStart = -1;
|
||||
const int INITIAL = 0;
|
||||
|
|
@ -177,7 +177,7 @@ public PT parsertools;
|
|||
}
|
||||
};
|
||||
|
||||
static int[] startState = new int[] {64, 98, 99, 100, 100, 101,
|
||||
static int[] startState = new int[] {65, 99, 100, 101, 101, 102,
|
||||
0};
|
||||
|
||||
#region TwoLevelCharacterMap
|
||||
|
|
@ -1177,52 +1177,52 @@ public PT parsertools;
|
|||
return MapC(code);
|
||||
}
|
||||
|
||||
static Table[] NxS = new Table[103] {
|
||||
static Table[] NxS = new Table[104] {
|
||||
/* NxS[ 0] */ new Table(0, 0, 0, null),
|
||||
/* NxS[ 1] */ new Table(1, 19, -1, new sbyte[] {52, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53}),
|
||||
/* NxS[ 1] */ new Table(1, 19, -1, new sbyte[] {53, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54}),
|
||||
/* NxS[ 2] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {97}),
|
||||
/* NxS[ 4] */ new Table(26, 19, -1, new sbyte[] {50, 50, 50, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, 50, -1, -1, -1, -1, 50, 50, 50}),
|
||||
/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {49}),
|
||||
/* NxS[ 6] */ new Table(19, 1, -1, new sbyte[] {48}),
|
||||
/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {98}),
|
||||
/* NxS[ 4] */ new Table(26, 19, -1, new sbyte[] {51, 51, 51, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, 51, -1, -1, -1, -1, 51, 51, 51}),
|
||||
/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {50}),
|
||||
/* NxS[ 6] */ new Table(19, 1, -1, new sbyte[] {49}),
|
||||
/* NxS[ 7] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 8] */ new Table(28, 17, -1, new sbyte[] {25, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 25, 25, 25, -1, 25, -1, 25, 25}),
|
||||
/* NxS[ 9] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 10] */ new Table(19, 1, -1, new sbyte[] {47}),
|
||||
/* NxS[ 11] */ new Table(13, 1, -1, new sbyte[] {46}),
|
||||
/* NxS[ 10] */ new Table(19, 1, -1, new sbyte[] {48}),
|
||||
/* NxS[ 11] */ new Table(13, 1, -1, new sbyte[] {47}),
|
||||
/* NxS[ 12] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 13] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 14] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 15] */ new Table(13, 3, -1, new sbyte[] {44, -1, 45}),
|
||||
/* NxS[ 15] */ new Table(13, 5, -1, new sbyte[] {44, -1, 45, -1, 46}),
|
||||
/* NxS[ 16] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 17] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 18] */ new Table(19, 1, -1, new sbyte[] {43}),
|
||||
/* NxS[ 19] */ new Table(19, 4, -1, new sbyte[] {41, -1, -1, 42}),
|
||||
/* NxS[ 20] */ new Table(19, 1, -1, new sbyte[] {40}),
|
||||
/* NxS[ 21] */ new Table(19, 5, -1, new sbyte[] {35, -1, -1, 36, 70}),
|
||||
/* NxS[ 21] */ new Table(19, 5, -1, new sbyte[] {35, -1, -1, 36, 71}),
|
||||
/* NxS[ 22] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 23] */ new Table(26, 1, -1, new sbyte[] {69}),
|
||||
/* NxS[ 24] */ new Table(13, 32, -1, new sbyte[] {66, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 24, 24, 67, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 24, -1, 67}),
|
||||
/* NxS[ 23] */ new Table(26, 1, -1, new sbyte[] {70}),
|
||||
/* NxS[ 24] */ new Table(13, 32, -1, new sbyte[] {67, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 24, 24, 68, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 24, -1, 68}),
|
||||
/* NxS[ 25] */ new Table(26, 19, -1, new sbyte[] {25, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 25, 25, 25, 25, 25, -1, 25, 25, 25, 25}),
|
||||
/* NxS[ 26] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 27] */ new Table(45, 4, 65, new sbyte[] {31, 65, 65, -1}),
|
||||
/* NxS[ 27] */ new Table(45, 4, 66, new sbyte[] {31, 66, 66, -1}),
|
||||
/* NxS[ 28] */ new Table(26, 19, -1, new sbyte[] {29, 29, 30, 30, 30, 30,
|
||||
30, 30, 30, 30, 30, 30, 30, 30, -1, 30, 29, 30, 30}),
|
||||
/* NxS[ 29] */ new Table(26, 17, -1, new sbyte[] {29, 29, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29}),
|
||||
/* NxS[ 30] */ new Table(26, 19, -1, new sbyte[] {30, 30, 30, 30, 30, 30,
|
||||
30, 30, 30, 30, 30, 30, 30, 30, -1, 30, 30, 30, 30}),
|
||||
/* NxS[ 31] */ new Table(45, 1, -1, new sbyte[] {65}),
|
||||
/* NxS[ 31] */ new Table(45, 1, -1, new sbyte[] {66}),
|
||||
/* NxS[ 32] */ new Table(26, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}),
|
||||
/* NxS[ 33] */ new Table(26, 19, -1, new sbyte[] {33, 33, 67, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 67}),
|
||||
/* NxS[ 33] */ new Table(26, 19, -1, new sbyte[] {33, 33, 68, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 68}),
|
||||
/* NxS[ 34] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 35] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 36] */ new Table(0, 0, -1, null),
|
||||
|
|
@ -1239,70 +1239,71 @@ public PT parsertools;
|
|||
/* NxS[ 47] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 48] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 49] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 50] */ new Table(26, 19, -1, new sbyte[] {50, 50, 50, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, 50, -1, -1, -1, -1, 50, 50, 50}),
|
||||
/* NxS[ 51] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 52] */ new Table(0, 7, 52, new sbyte[] {-1, 52, 52, 52, 52, 52,
|
||||
/* NxS[ 50] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 51] */ new Table(26, 19, -1, new sbyte[] {51, 51, 51, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, 51, -1, -1, -1, -1, 51, 51, 51}),
|
||||
/* NxS[ 52] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 53] */ new Table(0, 7, 53, new sbyte[] {-1, 53, 53, 53, 53, 53,
|
||||
-1}),
|
||||
/* NxS[ 53] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 54] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 55] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 56] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 57] */ new Table(9, 1, -1, new sbyte[] {58}),
|
||||
/* NxS[ 58] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 57] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 58] */ new Table(9, 1, -1, new sbyte[] {59}),
|
||||
/* NxS[ 59] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 60] */ new Table(1, 1, -1, new sbyte[] {63}),
|
||||
/* NxS[ 61] */ new Table(4, 1, -1, new sbyte[] {102}),
|
||||
/* NxS[ 62] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 63] */ new Table(0, 7, 63, new sbyte[] {-1, 63, 63, 63, 63, 63,
|
||||
/* NxS[ 60] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 61] */ new Table(1, 1, -1, new sbyte[] {64}),
|
||||
/* NxS[ 62] */ new Table(4, 1, -1, new sbyte[] {103}),
|
||||
/* NxS[ 63] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 64] */ new Table(0, 7, 64, new sbyte[] {-1, 64, 64, 64, 64, 64,
|
||||
-1}),
|
||||
/* NxS[ 64] */ new Table(40, 36, 25, new sbyte[] {26, 25, 24, 25, 25, 27,
|
||||
/* NxS[ 65] */ new Table(40, 36, 25, new sbyte[] {26, 25, 24, 25, 25, 27,
|
||||
28, 2, -1, 1, 2, 3, 4, -1, -1, 5, 6, 7, 8, 9, 10, 11,
|
||||
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24}),
|
||||
/* NxS[ 65] */ new Table(45, 4, 65, new sbyte[] {31, 65, 65, -1}),
|
||||
/* NxS[ 66] */ new Table(26, 17, -1, new sbyte[] {33, 33, -1, -1, -1, -1,
|
||||
/* NxS[ 66] */ new Table(45, 4, 66, new sbyte[] {31, 66, 66, -1}),
|
||||
/* NxS[ 67] */ new Table(26, 17, -1, new sbyte[] {33, 33, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33}),
|
||||
/* NxS[ 67] */ new Table(20, 23, -1, new sbyte[] {68, 68, -1, -1, -1, -1,
|
||||
/* NxS[ 68] */ new Table(20, 23, -1, new sbyte[] {69, 69, -1, -1, -1, -1,
|
||||
32, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
32}),
|
||||
/* NxS[ 68] */ new Table(26, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1,
|
||||
/* NxS[ 69] */ new Table(26, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}),
|
||||
/* NxS[ 69] */ new Table(27, 1, -1, new sbyte[] {34}),
|
||||
/* NxS[ 70] */ new Table(28, 9, -1, new sbyte[] {71, -1, -1, -1, 72, -1,
|
||||
-1, -1, 73}),
|
||||
/* NxS[ 71] */ new Table(29, 1, -1, new sbyte[] {87}),
|
||||
/* NxS[ 72] */ new Table(36, 1, -1, new sbyte[] {78}),
|
||||
/* NxS[ 73] */ new Table(39, 1, -1, new sbyte[] {74}),
|
||||
/* NxS[ 74] */ new Table(30, 1, -1, new sbyte[] {75}),
|
||||
/* NxS[ 75] */ new Table(28, 1, -1, new sbyte[] {76}),
|
||||
/* NxS[ 76] */ new Table(22, 1, -1, new sbyte[] {77}),
|
||||
/* NxS[ 77] */ new Table(22, 1, -1, new sbyte[] {37}),
|
||||
/* NxS[ 78] */ new Table(37, 1, -1, new sbyte[] {79}),
|
||||
/* NxS[ 79] */ new Table(36, 1, -1, new sbyte[] {80}),
|
||||
/* NxS[ 80] */ new Table(28, 1, -1, new sbyte[] {81}),
|
||||
/* NxS[ 81] */ new Table(38, 1, -1, new sbyte[] {82}),
|
||||
/* NxS[ 82] */ new Table(28, 1, -1, new sbyte[] {83}),
|
||||
/* NxS[ 83] */ new Table(35, 1, -1, new sbyte[] {84}),
|
||||
/* NxS[ 84] */ new Table(36, 1, -1, new sbyte[] {85}),
|
||||
/* NxS[ 85] */ new Table(22, 1, -1, new sbyte[] {86}),
|
||||
/* NxS[ 86] */ new Table(22, 1, -1, new sbyte[] {38}),
|
||||
/* NxS[ 87] */ new Table(30, 1, -1, new sbyte[] {88}),
|
||||
/* NxS[ 88] */ new Table(31, 1, -1, new sbyte[] {89}),
|
||||
/* NxS[ 89] */ new Table(28, 1, -1, new sbyte[] {90}),
|
||||
/* NxS[ 90] */ new Table(32, 1, -1, new sbyte[] {91}),
|
||||
/* NxS[ 70] */ new Table(27, 1, -1, new sbyte[] {34}),
|
||||
/* NxS[ 71] */ new Table(28, 9, -1, new sbyte[] {72, -1, -1, -1, 73, -1,
|
||||
-1, -1, 74}),
|
||||
/* NxS[ 72] */ new Table(29, 1, -1, new sbyte[] {88}),
|
||||
/* NxS[ 73] */ new Table(36, 1, -1, new sbyte[] {79}),
|
||||
/* NxS[ 74] */ new Table(39, 1, -1, new sbyte[] {75}),
|
||||
/* NxS[ 75] */ new Table(30, 1, -1, new sbyte[] {76}),
|
||||
/* NxS[ 76] */ new Table(28, 1, -1, new sbyte[] {77}),
|
||||
/* NxS[ 77] */ new Table(22, 1, -1, new sbyte[] {78}),
|
||||
/* NxS[ 78] */ new Table(22, 1, -1, new sbyte[] {37}),
|
||||
/* NxS[ 79] */ new Table(37, 1, -1, new sbyte[] {80}),
|
||||
/* NxS[ 80] */ new Table(36, 1, -1, new sbyte[] {81}),
|
||||
/* NxS[ 81] */ new Table(28, 1, -1, new sbyte[] {82}),
|
||||
/* NxS[ 82] */ new Table(38, 1, -1, new sbyte[] {83}),
|
||||
/* NxS[ 83] */ new Table(28, 1, -1, new sbyte[] {84}),
|
||||
/* NxS[ 84] */ new Table(35, 1, -1, new sbyte[] {85}),
|
||||
/* NxS[ 85] */ new Table(36, 1, -1, new sbyte[] {86}),
|
||||
/* NxS[ 86] */ new Table(22, 1, -1, new sbyte[] {87}),
|
||||
/* NxS[ 87] */ new Table(22, 1, -1, new sbyte[] {38}),
|
||||
/* NxS[ 88] */ new Table(30, 1, -1, new sbyte[] {89}),
|
||||
/* NxS[ 89] */ new Table(31, 1, -1, new sbyte[] {90}),
|
||||
/* NxS[ 90] */ new Table(28, 1, -1, new sbyte[] {91}),
|
||||
/* NxS[ 91] */ new Table(32, 1, -1, new sbyte[] {92}),
|
||||
/* NxS[ 92] */ new Table(33, 1, -1, new sbyte[] {93}),
|
||||
/* NxS[ 93] */ new Table(34, 1, -1, new sbyte[] {94}),
|
||||
/* NxS[ 94] */ new Table(35, 1, -1, new sbyte[] {95}),
|
||||
/* NxS[ 95] */ new Table(22, 1, -1, new sbyte[] {96}),
|
||||
/* NxS[ 96] */ new Table(22, 1, -1, new sbyte[] {39}),
|
||||
/* NxS[ 97] */ new Table(0, 7, 97, new sbyte[] {-1, 97, 51, 97, 97, 97,
|
||||
/* NxS[ 92] */ new Table(32, 1, -1, new sbyte[] {93}),
|
||||
/* NxS[ 93] */ new Table(33, 1, -1, new sbyte[] {94}),
|
||||
/* NxS[ 94] */ new Table(34, 1, -1, new sbyte[] {95}),
|
||||
/* NxS[ 95] */ new Table(35, 1, -1, new sbyte[] {96}),
|
||||
/* NxS[ 96] */ new Table(22, 1, -1, new sbyte[] {97}),
|
||||
/* NxS[ 97] */ new Table(22, 1, -1, new sbyte[] {39}),
|
||||
/* NxS[ 98] */ new Table(0, 7, 98, new sbyte[] {-1, 98, 52, 98, 98, 98,
|
||||
-1}),
|
||||
/* NxS[ 98] */ new Table(2, 1, 54, new sbyte[] {55}),
|
||||
/* NxS[ 99] */ new Table(8, 1, 56, new sbyte[] {57}),
|
||||
/* NxS[ 100] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 101] */ new Table(1, 3, 59, new sbyte[] {60, 59, 61}),
|
||||
/* NxS[ 102] */ new Table(0, 7, 102, new sbyte[] {-1, 102, 62, 102, 102, 102,
|
||||
/* NxS[ 99] */ new Table(2, 1, 55, new sbyte[] {56}),
|
||||
/* NxS[ 100] */ new Table(8, 1, 57, new sbyte[] {58}),
|
||||
/* NxS[ 101] */ new Table(0, 0, -1, null),
|
||||
/* NxS[ 102] */ new Table(1, 3, 60, new sbyte[] {61, 60, 62}),
|
||||
/* NxS[ 103] */ new Table(0, 7, 103, new sbyte[] {-1, 103, 63, 103, 103, 103,
|
||||
-1}),
|
||||
};
|
||||
|
||||
|
|
@ -2068,24 +2069,27 @@ return (int)Tokens.tkQuestionPoint;
|
|||
return (int)Tokens.tkQuestionSquareOpen;
|
||||
break;
|
||||
case 46:
|
||||
return (int)Tokens.tkDotDot;
|
||||
return (int)Tokens.tkDoubleQuestion;
|
||||
break;
|
||||
case 47:
|
||||
yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign;
|
||||
return (int)Tokens.tkDotDot;
|
||||
break;
|
||||
case 48:
|
||||
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.Assignment); return (int)Tokens.tkAssign;
|
||||
break;
|
||||
case 49:
|
||||
BEGIN(COMMENT1);
|
||||
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.tkMultEqual;
|
||||
break;
|
||||
case 50:
|
||||
BEGIN(COMMENT1);
|
||||
break;
|
||||
case 51:
|
||||
yylval = new Union();
|
||||
currentLexLocation = CurrentLexLocation;
|
||||
yylval.ex = parsertools.create_hex_const(yytext,currentLexLocation);
|
||||
return (int)Tokens.tkHex;
|
||||
break;
|
||||
case 51:
|
||||
case 52:
|
||||
if (parsertools.build_tree_for_formatter)
|
||||
break;
|
||||
|
||||
|
|
@ -2136,36 +2140,36 @@ if (parsertools.build_tree_for_formatter)
|
|||
Defines.Add(directiveparam);
|
||||
}
|
||||
break;
|
||||
case 52:
|
||||
case 53:
|
||||
{
|
||||
|
||||
}
|
||||
break;
|
||||
case 53:
|
||||
case 54:
|
||||
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentDivision); return (int)Tokens.tkDivEqual;
|
||||
break;
|
||||
case 54:
|
||||
case 55:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case 55:
|
||||
BEGIN(INITIAL);
|
||||
break;
|
||||
case 56:
|
||||
case 57:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case 58:
|
||||
BEGIN(INITIAL);
|
||||
break;
|
||||
case 59:
|
||||
case 60:
|
||||
case 61:
|
||||
case 57:
|
||||
case 58:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case 59:
|
||||
BEGIN(INITIAL);
|
||||
break;
|
||||
case 60:
|
||||
case 61:
|
||||
case 62:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case 63:
|
||||
parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam);
|
||||
parsertools.CheckDirectiveParams(directivename,directiveparam); // directivename in UPPERCASE!
|
||||
if (directivename == "IFDEF")
|
||||
|
|
@ -2197,7 +2201,7 @@ parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam);
|
|||
BEGIN(INITIAL);
|
||||
}
|
||||
break;
|
||||
case 63:
|
||||
case 64:
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -186,6 +186,7 @@ UNICODEARROW \x890
|
|||
"]" { return (int)Tokens.tkSquareClose; }
|
||||
"?" { return (int)Tokens.tkQuestion; }
|
||||
"?." { return (int)Tokens.tkQuestionPoint; }
|
||||
"??" { return (int)Tokens.tkDoubleQuestion; }
|
||||
"?[" { return (int)Tokens.tkQuestionSquareOpen; }
|
||||
"@" { yylval = new Union(); yylval.op = new op_type_node(Operators.AddressOf); return (int)Tokens.tkAddressOf; }
|
||||
":=" { yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign; }
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
%start parse_goal
|
||||
|
||||
%token <ti> tkDirectiveName tkAmpersend tkColon tkDotDot tkPoint tkRoundOpen tkRoundClose tkSemiColon tkSquareOpen tkSquareClose tkQuestion tkQuestionPoint tkQuestionSquareOpen
|
||||
%token <ti> tkDirectiveName tkAmpersend tkColon tkDotDot tkPoint tkRoundOpen tkRoundClose tkSemiColon tkSquareOpen tkSquareClose tkQuestion tkQuestionPoint tkDoubleQuestion tkQuestionSquareOpen
|
||||
%token <ti> tkSizeOf tkTypeOf tkWhere tkArray tkCase tkClass tkAuto tkConst tkConstructor tkDestructor tkElse tkExcept tkFile tkFor tkForeach tkFunction
|
||||
%token <ti> tkIf tkImplementation tkInherited tkInterface tkProcedure tkOperator tkProperty tkRaise tkRecord tkSet tkType tkThen tkUses tkVar tkWhile tkWith tkNil
|
||||
%token <ti> tkGoto tkOf tkLabel tkLock tkProgram tkEvent tkDefault tkTemplate tkPacked tkExports tkResourceString tkThreadvar tkSealed tkPartial tkTo tkDownto
|
||||
|
|
@ -79,7 +79,7 @@
|
|||
%type <stn> typed_const_list1 typed_const_list optional_expr_list elem_list optional_expr_list_with_bracket expr_list const_elem_list1 const_func_expr_list case_label_list const_elem_list optional_const_func_expr_list elem_list1
|
||||
%type <stn> enumeration_id expr_l1_list
|
||||
%type <stn> enumeration_id_list
|
||||
%type <ex> const_simple_expr term typed_const typed_const_plus typed_var_init_expression expr expr_with_func_decl_lambda const_expr elem range_expr const_elem array_const factor relop_expr expr_l1 simple_expr range_term range_factor
|
||||
%type <ex> const_simple_expr term typed_const typed_const_plus typed_var_init_expression expr expr_with_func_decl_lambda const_expr elem range_expr const_elem array_const factor relop_expr double_question_expr expr_l1 simple_expr range_term range_factor
|
||||
%type <ex> external_directive_ident init_const_expr case_label variable var_reference simple_expr_or_nothing var_question_point
|
||||
%type <ob> for_cycle_type
|
||||
%type <ex> format_expr
|
||||
|
|
@ -1073,6 +1073,13 @@ type_decl_type
|
|||
type_ref
|
||||
: simple_type
|
||||
{ $$ = $1; }
|
||||
| simple_type tkQuestion
|
||||
{
|
||||
var l = new List<ident>();
|
||||
l.Add(new ident("System"));
|
||||
l.Add(new ident("Nullable"));
|
||||
$$ = new template_type_reference(new named_type_reference(l), new template_param_list($1), @$);
|
||||
}
|
||||
| string_type
|
||||
{ $$ = $1; }
|
||||
| pointer_type
|
||||
|
|
@ -2688,11 +2695,18 @@ expr
|
|||
;
|
||||
|
||||
expr_l1
|
||||
: relop_expr
|
||||
: double_question_expr
|
||||
{ $$ = $1; }
|
||||
| question_expr
|
||||
{ $$ = $1; }
|
||||
;
|
||||
|
||||
double_question_expr
|
||||
: relop_expr
|
||||
{ $$ = $1; }
|
||||
| double_question_expr tkDoubleQuestion relop_expr
|
||||
{ $$ = new double_question_node($1 as expression, $3 as expression, @$);}
|
||||
;
|
||||
|
||||
sizeof_expr
|
||||
: tkSizeOf tkRoundOpen simple_or_template_type_reference tkRoundClose
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1112,6 +1112,11 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
{
|
||||
DefaultVisit(_sugared_addressed_value);
|
||||
}
|
||||
|
||||
public virtual void visit(double_question_node _double_question_node)
|
||||
{
|
||||
DefaultVisit(_double_question_node);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1773,6 +1773,14 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
{
|
||||
}
|
||||
|
||||
public virtual void pre_do_visit(double_question_node _double_question_node)
|
||||
{
|
||||
}
|
||||
|
||||
public virtual void post_do_visit(double_question_node _double_question_node)
|
||||
{
|
||||
}
|
||||
|
||||
public override void visit(syntax_tree_node _syntax_tree_node)
|
||||
{
|
||||
DefaultVisit(_syntax_tree_node);
|
||||
|
|
@ -3665,6 +3673,15 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
visit(sugared_addressed_value.new_addr_value);
|
||||
post_do_visit(_sugared_addressed_value);
|
||||
}
|
||||
|
||||
public override void visit(double_question_node _double_question_node)
|
||||
{
|
||||
DefaultVisit(_double_question_node);
|
||||
pre_do_visit(_double_question_node);
|
||||
visit(double_question_node.left);
|
||||
visit(double_question_node.right);
|
||||
post_do_visit(_double_question_node);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -462,6 +462,8 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
return new sugared_expression();
|
||||
case 220:
|
||||
return new sugared_addressed_value();
|
||||
case 221:
|
||||
return new double_question_node();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
@ -3903,6 +3905,19 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
_sugared_addressed_value.new_addr_value = _read_node() as addressed_value;
|
||||
}
|
||||
|
||||
|
||||
public void visit(double_question_node _double_question_node)
|
||||
{
|
||||
read_double_question_node(_double_question_node);
|
||||
}
|
||||
|
||||
public void read_double_question_node(double_question_node _double_question_node)
|
||||
{
|
||||
read_addressed_value_funcname(_double_question_node);
|
||||
_double_question_node.left = _read_node() as expression;
|
||||
_double_question_node.right = _read_node() as expression;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -6099,6 +6099,36 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public void visit(double_question_node _double_question_node)
|
||||
{
|
||||
bw.Write((Int16)221);
|
||||
write_double_question_node(_double_question_node);
|
||||
}
|
||||
|
||||
public void write_double_question_node(double_question_node _double_question_node)
|
||||
{
|
||||
write_addressed_value_funcname(_double_question_node);
|
||||
if (_double_question_node.left == null)
|
||||
{
|
||||
bw.Write((byte)0);
|
||||
}
|
||||
else
|
||||
{
|
||||
bw.Write((byte)1);
|
||||
_double_question_node.left.visit(this);
|
||||
}
|
||||
if (_double_question_node.right == null)
|
||||
{
|
||||
bw.Write((byte)0);
|
||||
}
|
||||
else
|
||||
{
|
||||
bw.Write((byte)1);
|
||||
_double_question_node.right.visit(this);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -47165,6 +47165,192 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
}
|
||||
|
||||
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
[Serializable]
|
||||
public partial class double_question_node : addressed_value_funcname
|
||||
{
|
||||
|
||||
///<summary>
|
||||
///Конструктор без параметров.
|
||||
///</summary>
|
||||
public double_question_node()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
///<summary>
|
||||
///Конструктор с параметрами.
|
||||
///</summary>
|
||||
public double_question_node(expression _left,expression _right)
|
||||
{
|
||||
this._left=_left;
|
||||
this._right=_right;
|
||||
FillParentsInDirectChilds();
|
||||
}
|
||||
|
||||
///<summary>
|
||||
///Конструктор с параметрами.
|
||||
///</summary>
|
||||
public double_question_node(expression _left,expression _right,SourceContext sc)
|
||||
{
|
||||
this._left=_left;
|
||||
this._right=_right;
|
||||
source_context = sc;
|
||||
FillParentsInDirectChilds();
|
||||
}
|
||||
protected expression _left;
|
||||
protected expression _right;
|
||||
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
public expression left
|
||||
{
|
||||
get
|
||||
{
|
||||
return _left;
|
||||
}
|
||||
set
|
||||
{
|
||||
_left=value;
|
||||
}
|
||||
}
|
||||
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
public expression right
|
||||
{
|
||||
get
|
||||
{
|
||||
return _right;
|
||||
}
|
||||
set
|
||||
{
|
||||
_right=value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary> Создает копию узла </summary>
|
||||
public override syntax_tree_node Clone()
|
||||
{
|
||||
double_question_node copy = new double_question_node();
|
||||
copy.Parent = this.Parent;
|
||||
if (source_context != null)
|
||||
copy.source_context = new SourceContext(source_context);
|
||||
if (attributes != null)
|
||||
{
|
||||
copy.attributes = (attribute_list)attributes.Clone();
|
||||
copy.attributes.Parent = copy;
|
||||
}
|
||||
if (left != null)
|
||||
{
|
||||
copy.left = (expression)left.Clone();
|
||||
copy.left.Parent = copy;
|
||||
}
|
||||
if (right != null)
|
||||
{
|
||||
copy.right = (expression)right.Clone();
|
||||
copy.right.Parent = copy;
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
/// <summary> Получает копию данного узла корректного типа </summary>
|
||||
public new double_question_node TypedClone()
|
||||
{
|
||||
return Clone() as double_question_node;
|
||||
}
|
||||
|
||||
///<summary> Заполняет поля Parent в непосредственных дочерних узлах </summary>
|
||||
public override void FillParentsInDirectChilds()
|
||||
{
|
||||
if (attributes != null)
|
||||
attributes.Parent = this;
|
||||
if (left != null)
|
||||
left.Parent = this;
|
||||
if (right != null)
|
||||
right.Parent = this;
|
||||
}
|
||||
|
||||
///<summary> Заполняет поля Parent во всем поддереве </summary>
|
||||
public override void FillParentsInAllChilds()
|
||||
{
|
||||
FillParentsInDirectChilds();
|
||||
attributes?.FillParentsInAllChilds();
|
||||
left?.FillParentsInAllChilds();
|
||||
right?.FillParentsInAllChilds();
|
||||
}
|
||||
|
||||
///<summary>
|
||||
///Свойство для получения количества всех подузлов без элементов поля типа List
|
||||
///</summary>
|
||||
public override Int32 subnodes_without_list_elements_count
|
||||
{
|
||||
get
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
///<summary>
|
||||
///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List
|
||||
///</summary>
|
||||
public override Int32 subnodes_count
|
||||
{
|
||||
get
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
///<summary>
|
||||
///Индексатор для получения всех подузлов
|
||||
///</summary>
|
||||
public override syntax_tree_node this[Int32 ind]
|
||||
{
|
||||
get
|
||||
{
|
||||
if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1)
|
||||
throw new IndexOutOfRangeException();
|
||||
switch(ind)
|
||||
{
|
||||
case 0:
|
||||
return left;
|
||||
case 1:
|
||||
return right;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
set
|
||||
{
|
||||
if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1)
|
||||
throw new IndexOutOfRangeException();
|
||||
switch(ind)
|
||||
{
|
||||
case 0:
|
||||
left = (expression)value;
|
||||
break;
|
||||
case 1:
|
||||
right = (expression)value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
///<summary>
|
||||
///Метод для обхода дерева посетителем
|
||||
///</summary>
|
||||
///<param name="visitor">Объект-посетитель.</param>
|
||||
///<returns>Return value is void</returns>
|
||||
public override void visit(IVisitor visitor)
|
||||
{
|
||||
visitor.visit(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1330,6 +1330,12 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
///<param name="_sugared_addressed_value">Node to visit</param>
|
||||
///<returns> Return value is void </returns>
|
||||
void visit(sugared_addressed_value _sugared_addressed_value);
|
||||
///<summary>
|
||||
///Method to visit double_question_node.
|
||||
///</summary>
|
||||
///<param name="_double_question_node">Node to visit</param>
|
||||
///<returns> Return value is void </returns>
|
||||
void visit(double_question_node _double_question_node);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2842,6 +2842,17 @@
|
|||
<TagIndices />
|
||||
</Tags>
|
||||
</SyntaxNode>
|
||||
<SyntaxNode Name="double_question_node" BaseName="addressed_value_funcname">
|
||||
<Fields>
|
||||
<SyntaxField Name="left" SyntaxType="expression" />
|
||||
<SyntaxField Name="right" SyntaxType="expression" />
|
||||
</Fields>
|
||||
<Methods />
|
||||
<Tags>
|
||||
<CategoryIndices />
|
||||
<TagIndices />
|
||||
</Tags>
|
||||
</SyntaxNode>
|
||||
</SyntaxNodes>
|
||||
<Settings>
|
||||
<FileName>Tree.cs</FileName>
|
||||
|
|
@ -3225,6 +3236,9 @@
|
|||
<HelpData Key="double_const." Value="" />
|
||||
<HelpData Key="double_const.override string ToString()" Value="" />
|
||||
<HelpData Key="double_const.val" Value="Значение вещественной константы" />
|
||||
<HelpData Key="double_question_node" Value="" />
|
||||
<HelpData Key="double_question_node.left" Value="" />
|
||||
<HelpData Key="double_question_node.right" Value="" />
|
||||
<HelpData Key="eee" Value="" />
|
||||
<HelpData Key="empty_statement" Value="" />
|
||||
<HelpData Key="enum_type_definition" Value="" />
|
||||
|
|
|
|||
|
|
@ -36,6 +36,9 @@ namespace PascalABCCompiler.SyntaxTreeConverters
|
|||
// question_point_desugar_visitor
|
||||
QuestionPointDesugarVisitor.New.ProcessNode(root);
|
||||
|
||||
// double_question_desugar_visitor
|
||||
DoubleQuestionDesugarVisitor.New.ProcessNode(root);
|
||||
|
||||
|
||||
// Всё, связанное с yield
|
||||
MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root);
|
||||
|
|
|
|||
|
|
@ -154,9 +154,10 @@ namespace SyntaxVisitors.SugarVisitors
|
|||
|
||||
public override void visit(dot_question_node dqn)
|
||||
{
|
||||
var sug = ConvertToQCE1(dqn);
|
||||
visit(sug);
|
||||
var qce = ConvertToQCE1(dqn);
|
||||
var sug = sugared_addressed_value.NewP(dqn, qce, dqn.source_context);
|
||||
ReplaceUsingParent(dqn, sug);
|
||||
visit(qce);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@
|
|||
<Compile Include="BaseVisitors\SmallHelperVisitors.cs" />
|
||||
<Compile Include="ChangeWhileVisitor.cs" />
|
||||
<Compile Include="SugarVisitors\AssignTuplesDesugarVisitor.cs" />
|
||||
<Compile Include="SugarVisitors\DoubleQuestionDesugarVisitor.cs" />
|
||||
<Compile Include="SugarVisitors\QuestionPointDesugarVisitor.cs" />
|
||||
<Compile Include="SugarVisitors\SliceDesugarVisitor.cs" />
|
||||
<Compile Include="SugarVisitors\TupleVisitor.cs" />
|
||||
|
|
|
|||
|
|
@ -104,5 +104,12 @@ namespace PascalABCCompiler.TreeConverter
|
|||
//if (tup.el.expressions.Count > 7)
|
||||
// AddError(get_location(tup),"TUPLE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7");
|
||||
}*/
|
||||
|
||||
public void semantic_check_dot_question(SyntaxTree.question_colon_expression qce)
|
||||
{
|
||||
var av = convert_strong((qce.condition as bin_expr).left);
|
||||
if (!av.type.is_class)
|
||||
AddError(av.location, "OPERATOR_DQ_MUST_BE_USED_WITH_A_REFERENCE_TYPE_VALUETYPE");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19428,6 +19428,18 @@ namespace PascalABCCompiler.TreeConverter
|
|||
{
|
||||
semantic_check_method_call_as_slice_expr(av.new_addr_value as SyntaxTree.method_call);
|
||||
}
|
||||
else if (av.sugared_expr is SyntaxTree.dot_question_node)
|
||||
{
|
||||
var qce = av.new_addr_value as SyntaxTree.question_colon_expression;
|
||||
var av_cs = convert_strong(qce.ret_if_false);
|
||||
if (!type_table.is_with_nil_allowed(av_cs.type))
|
||||
{
|
||||
var dn = new dot_node(new ident("PABCSystem"), new ident("DQNToNullable"));
|
||||
(av.new_addr_value as SyntaxTree.question_colon_expression).ret_if_false
|
||||
= new method_call(dn, new expression_list((av.new_addr_value as SyntaxTree.question_colon_expression).ret_if_false), av.source_context);
|
||||
}
|
||||
semantic_check_dot_question(av.new_addr_value as SyntaxTree.question_colon_expression);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddError(get_location(av), "MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}", av.sugared_expr.GetType().Name);
|
||||
|
|
|
|||
|
|
@ -1976,6 +1976,12 @@ procedure __InitPABCSystem;
|
|||
///--
|
||||
procedure __FinalizeModule__;
|
||||
|
||||
// -----------------------------------------------------
|
||||
// DQNToNullable for dot_question_node
|
||||
// -----------------------------------------------------
|
||||
|
||||
function DQNToNullable(v:Int32):Nullable<System.Int32>;
|
||||
|
||||
implementation
|
||||
|
||||
var
|
||||
|
|
@ -10547,6 +10553,15 @@ begin
|
|||
input.sr.Close;
|
||||
end;
|
||||
|
||||
// -----------------------------------------------------
|
||||
// DQNToNullable for dot_question_node: implementation
|
||||
// -----------------------------------------------------
|
||||
|
||||
function DQNToNullable (v:Int32):Nullable<System.Int32>;
|
||||
begin
|
||||
Result:=new Nullable<System.Int32>(v);
|
||||
end;
|
||||
|
||||
initialization
|
||||
__InitModule;
|
||||
finalization
|
||||
|
|
|
|||
|
|
@ -11,3 +11,4 @@ ONE_TKIDENTIFIER=В качестве типа ожидался идентифи
|
|||
SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR=Сахарный узел {0} не должен обходиться в syntax_tree_visitor. Обратитесь к разработчикам PascalABC.NET
|
||||
MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}=Отсутствует семантическая проверка для сахарного узла {0}
|
||||
TUPLE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Количество элементов кортежа не должно быть больше 7
|
||||
OPERATOR_DQ_MUST_BE_USED_WITH_A_REFERENCE_TYPE_VALUETYPE=Оператор ?. может применяться только к ссылочным типам
|
||||
Loading…
Reference in a new issue