Add: ??, integer? and semantic checks for ?.

This commit is contained in:
janise93 2017-06-03 00:30:15 +03:00
parent 09323f7945
commit d6fd84b935
18 changed files with 3210 additions and 2856 deletions

View file

@ -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:
{
}

View file

@ -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; }

View file

@ -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

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}
}

View file

@ -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);
}
}
}

View file

@ -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);
}

View file

@ -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="" />

View file

@ -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);

View file

@ -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);
}
}
}

View file

@ -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" />

View file

@ -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");
}
}
}

View file

@ -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);

View file

@ -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

View file

@ -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=Оператор ?. может применяться только к ссылочным типам