@@ -92,6 +92,7 @@ enum EToken
92
92
TOKEN_TZDATETIME64 = -57 ,
93
93
TOKEN_TZTIMESTAMP64 = -58 ,
94
94
TOKEN_MULTI = -59 ,
95
+ TOKEN_ERROR = -60 ,
95
96
96
97
// identifiers
97
98
TOKEN_IDENTIFIER = -100 ,
@@ -164,6 +165,7 @@ EToken TokenTypeFromStr(TStringBuf str)
164
165
{ TStringBuf (" TzDate32" ), TOKEN_TZDATE32 },
165
166
{ TStringBuf (" TzDatetime64" ), TOKEN_TZDATETIME64},
166
167
{ TStringBuf (" TzTimestamp64" ), TOKEN_TZTIMESTAMP64 },
168
+ { TStringBuf (" Error" ), TOKEN_ERROR},
167
169
};
168
170
169
171
auto it = map.find (str);
@@ -343,6 +345,10 @@ class TTypeParser
343
345
type = ParseScalarType ();
344
346
break ;
345
347
348
+ case TOKEN_ERROR:
349
+ type = ParseErrorType ();
350
+ break ;
351
+
346
352
default :
347
353
if (Identifier.empty ()) {
348
354
return AddError (" Expected type" );
@@ -703,6 +709,51 @@ class TTypeParser
703
709
return MakeScalarType (itemType);
704
710
}
705
711
712
+ TAstNode* ParseErrorType () {
713
+ GetNextToken (); // eat keyword
714
+ EXPECT_AND_SKIP_TOKEN (' <' , nullptr );
715
+
716
+ TString file;
717
+ if (Token == TOKEN_IDENTIFIER ||
718
+ Token == TOKEN_ESCAPED_IDENTIFIER)
719
+ {
720
+ file = Identifier;
721
+ } else {
722
+ return AddError (" Expected file name" );
723
+ }
724
+
725
+ GetNextToken (); // eat file name
726
+ EXPECT_AND_SKIP_TOKEN (' :' , nullptr );
727
+ ui32 line;
728
+ if (!(Token == TOKEN_IDENTIFIER ||
729
+ Token == TOKEN_ESCAPED_IDENTIFIER) || !TryFromString (Identifier, line)) {
730
+ return AddError (" Expected line" );
731
+ }
732
+
733
+ GetNextToken ();
734
+ EXPECT_AND_SKIP_TOKEN (' :' , nullptr );
735
+ ui32 column;
736
+ if (!(Token == TOKEN_IDENTIFIER ||
737
+ Token == TOKEN_ESCAPED_IDENTIFIER) || !TryFromString (Identifier, column)) {
738
+ return AddError (" Expected column" );
739
+ }
740
+
741
+ GetNextToken ();
742
+ EXPECT_AND_SKIP_TOKEN (' :' , nullptr );
743
+ TString message;
744
+ if (Token == TOKEN_IDENTIFIER ||
745
+ Token == TOKEN_ESCAPED_IDENTIFIER)
746
+ {
747
+ message = Identifier;
748
+ } else {
749
+ return AddError (" Expected message" );
750
+ }
751
+
752
+ GetNextToken ();
753
+ EXPECT_AND_SKIP_TOKEN (' >' , nullptr );
754
+ return MakeErrorType (file, line, column, message);
755
+ }
756
+
706
757
TAstNode* ParseDecimalType () {
707
758
GetNextToken (); // eat keyword
708
759
EXPECT_AND_SKIP_TOKEN (' (' , nullptr );
@@ -974,6 +1025,17 @@ class TTypeParser
974
1025
return MakeList (items, Y_ARRAY_SIZE (items));
975
1026
}
976
1027
1028
+ TAstNode* MakeErrorType (TStringBuf file, ui32 row, ui32 column, TStringBuf message) {
1029
+ TAstNode* items[] = {
1030
+ MakeLiteralAtom (TStringBuf (" ErrorType" )),
1031
+ MakeQuotedAtom (ToString (row)),
1032
+ MakeQuotedAtom (ToString (column)),
1033
+ MakeQuotedAtom (file, TNodeFlags::ArbitraryContent),
1034
+ MakeQuotedAtom (message, TNodeFlags::ArbitraryContent)
1035
+ };
1036
+ return MakeList (items, Y_ARRAY_SIZE (items));
1037
+ }
1038
+
977
1039
TAstNode* MakeVariantType (TAstNode* underlyingType) {
978
1040
TAstNode* items[] = {
979
1041
MakeLiteralAtom (TStringBuf (" VariantType" )),
0 commit comments