@@ -157,6 +157,7 @@ void Parser::pre_init_tokenizer ()
157157 Token.Token_File_Pos .offset = 0 ;
158158 Token.Token_Col_No = 0 ;
159159 Token.Token_String = NULL ;
160+ Token.freeString = false ;
160161 Token.Unget_Token = false ;
161162 Token.End_Of_File = false ;
162163 Token.Data = NULL ;
@@ -1053,8 +1054,6 @@ void Parser::Read_String_Literal()
10531054 End_String ();
10541055
10551056 Write_Token (STRING_LITERAL_TOKEN, col);
1056-
1057- Token.Token_String = String;
10581057}
10591058
10601059
@@ -1277,6 +1276,7 @@ void Parser::Read_Symbol()
12771276 POV_PARAM *Par;
12781277 DBL val;
12791278 SYM_TABLE *table;
1279+ char *dictIndex = NULL ;
12801280
12811281 Begin_String_Fast ();
12821282
@@ -1372,6 +1372,8 @@ void Parser::Read_Symbol()
13721372 bool breakLoop = false ;
13731373 while (!breakLoop)
13741374 {
1375+ dictIndex = NULL ;
1376+
13751377 switch (Token.Token_Id )
13761378 {
13771379 case ARRAY_ID_TOKEN:
@@ -1427,24 +1429,35 @@ void Parser::Read_Symbol()
14271429 c = Echo_getc ();
14281430 Echo_ungetc (c);
14291431
1430- if (c!=' .' )
1431- {
1432- breakLoop = true ;
1433- break ;
1434- }
1435-
1432+ dictIndex = NULL ;
14361433 table = reinterpret_cast <SYM_TABLE *>(*(Token.DataPtr ));
14371434
1438- GET (PERIOD_TOKEN)
1439- bool oldParseRawIdentifiers = parseRawIdentifiers;
1440- parseRawIdentifiers = true ;
1441- Get_Token ();
1442- parseRawIdentifiers = oldParseRawIdentifiers;
1435+ if (c ==' .' )
1436+ {
1437+ GET (PERIOD_TOKEN)
1438+ bool oldParseRawIdentifiers = parseRawIdentifiers;
1439+ parseRawIdentifiers = true ;
1440+ Get_Token ();
1441+ parseRawIdentifiers = oldParseRawIdentifiers;
1442+
1443+ if (Token.Token_Id != IDENTIFIER_TOKEN)
1444+ Expectation_Error (" dictionary element identifier" );
14431445
1444- if (Token.Token_Id != IDENTIFIER_TOKEN)
1445- Expectation_Error (" dictionary element identifier" );
1446+ Temp_Entry = Find_Symbol (table, Token.Token_String );
1447+ }
1448+ else if (c == ' [' )
1449+ {
1450+ GET (LEFT_SQUARE_TOKEN)
1451+ dictIndex = Parse_C_String ();
1452+ GET (RIGHT_SQUARE_TOKEN);
14461453
1447- Temp_Entry = Find_Symbol (table, Token.Token_String );
1454+ Temp_Entry = Find_Symbol (table, dictIndex);
1455+ }
1456+ else
1457+ {
1458+ breakLoop = true ;
1459+ break ;
1460+ }
14481461
14491462 if (Temp_Entry)
14501463 {
@@ -1493,10 +1506,20 @@ void Parser::Read_Symbol()
14931506 }
14941507
14951508 Write_Token (IDENTIFIER_TOKEN, Token.Token_Col_No );
1509+ if (dictIndex != NULL )
1510+ {
1511+ Token.Token_String = dictIndex;
1512+ Token.freeString = true ;
1513+ }
14961514}
14971515
14981516inline void Parser::Write_Token (TOKEN Token_Id, int col, SYM_TABLE *table)
14991517{
1518+ if (Token.freeString )
1519+ {
1520+ POV_FREE (Token.Token_String );
1521+ Token.freeString = false ;
1522+ }
15001523 Token.Token_File_Pos = Input_File->In_File ->tellg ();
15011524 Token.Token_Col_No = col;
15021525 Token.FileHandle = Input_File->In_File ;
0 commit comments