@@ -339,6 +339,27 @@ int SSyntacticAnalyzer::indexOfSymbolInCurrentBlock(QString name,
339339 return res;
340340}
341341
342+ bool SSyntacticAnalyzer::checkIfTypesMatch (const int object_symbol_id,
343+ const DataType rvalue_type,
344+ const int class_index)
345+ {
346+ if (object_symbol_id == -1 ) return false ;
347+
348+ // :TODO: expr_type --- data_type? smth else?
349+ // :TODO: multiple class indeces?
350+ // qDebug() << dataTypeToString(symbol_table_.at(object_symbol_id).data_type, class_index) << "lvalue_type";
351+ Symbol symbol = symbol_table_.at (object_symbol_id);
352+ if (symbol.data_type != rvalue_type) {
353+ emit semantic_error (-1 , QString (" (%1 and %2) %3" )
354+ .arg (dataTypeToString (symbol.data_type , class_index))
355+ .arg (dataTypeToString (rvalue_type, class_index))
356+ .arg (error_msg (E_TYPES_MISMATCH)));
357+ return false ;
358+ }
359+
360+ return true ;
361+ }
362+
342363bool SSyntacticAnalyzer::generateSetOfSituations ()
343364{
344365 if (grammar_.isEmpty ()) {
@@ -498,15 +519,14 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
498519 int object_symbol_id = -1 ;
499520 DataType expr_type;
500521 bool is_const;
501- DataType rvalue_type;
502522 int temp_class_index; // for class search
503523 // symbol params
504524 QList<int > args_indexes;
505525 ArgType arg_type;
506526 QList<DataType> data_types_stack;
507527 DataType temp_data_type; // for list of vars
508528 int decl_vars_count = 0 ;
509- int class_index = -1 ; // for data_types_stack
529+ int class_index = -1 ; // for var_type
510530 AccessSpecifier access_type = ACCESS_PUBLIC;
511531 QList<int > members_indexes;
512532
@@ -528,8 +548,8 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
528548
529549 if (!action_table_.at (state).contains (token)) {
530550 // action not defined
531- result.clear ();
532551 emit syntax_error (-1 , error_msg (E_INTERNAL_ACTION_UNDEFINED));
552+ result.clear ();
533553 return result;
534554 }
535555
@@ -564,8 +584,8 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
564584 if ((states_stack.length () <= rule.right_side .length ())
565585 || (tokens_stack.length () < rule.right_side .length ())) {
566586 // stacks have too few items
567- result.clear ();
568587 emit syntax_error (-1 , error_msg (E_INTERNAL_STATES_STACK_EMPTY));
588+ result.clear ();
569589 return result;
570590 }
571591
@@ -631,6 +651,15 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
631651 ids_stack.removeLast ();
632652 decl_vars_count--;
633653 }
654+
655+ if ((rule_index_full == 24 ) || (rule_index_full == 25 ) || (rule_index_full == 28 )
656+ || (rule_index_full == 29 )) {
657+ // <vars> with assignment
658+ if (!checkIfTypesMatch (symbol_index, expr_type, class_index)) {
659+ result.clear ();
660+ return result;
661+ }
662+ }
634663 break ;
635664
636665 case 30 :
@@ -649,16 +678,16 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
649678 // <var_type> ::= <id>
650679 temp_class_index =
651680 indexOfSymbolDeclaredInBlock (table_ids.at (ids_stack.last ().index ).name , SYM_CLASS, 0 );
652- if (temp_class_index > -1 ) {
653- data_types_stack << TYPE_OBJECT;
654- class_index = temp_class_index;
655- } else {
681+ if (temp_class_index == -1 ) {
656682 emit semantic_error (-1 , QString (" (%1) %2" )
657683 .arg (table_ids.at (ids_stack.last ().index ).name )
658684 .arg (error_msg (E_INVALID_OBJECT_TYPE)));
659685 result.clear ();
660686 return result;
661687 }
688+
689+ data_types_stack << TYPE_OBJECT;
690+ class_index = temp_class_index;
662691 ids_stack.removeLast ();
663692 break ;
664693
@@ -668,6 +697,15 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
668697 case 38 :
669698 // <more_vars>
670699 decl_vars_count++;
700+
701+ if ((rule_index_full == 36 ) || (rule_index_full == 38 )) {
702+ // <more_vars> with assignment
703+ // :TODO: object_symbol_id --- symbols will be inserted later in while-loop
704+ // if (!checkIfTypesMatch(object_symbol_id, expr_type, class_index)) {
705+ // result.clear();
706+ // return result;
707+ // }
708+ }
671709 break ;
672710
673711 case 39 :
@@ -697,6 +735,19 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
697735 ids_stack.removeLast ();
698736 break ;
699737
738+ case 76 :
739+ case 77 :
740+ case 78 :
741+ case 79 :
742+ case 80 :
743+ case 81 :
744+ // <operator_1> with assignment
745+ if (!checkIfTypesMatch (object_symbol_id, expr_type, class_index)) {
746+ result.clear ();
747+ return result;
748+ }
749+ break ;
750+
700751 case 108 :
701752 // <operator_9>, assign const
702753 expr_type = table_consts.at (tokens.at (i - 1 ).index ).type ;
@@ -794,35 +845,6 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
794845 break ;
795846 }
796847
797- // perform extra checks
798- switch (rule_index_full) {
799- case 24 :
800- case 25 :
801- case 28 :
802- case 29 :
803- // <vars> with assignment
804- case 36 :
805- case 38 :
806- // <more_vars> with assignment
807- case 76 :
808- case 77 :
809- case 78 :
810- case 79 :
811- case 80 :
812- case 81 :
813- // <operator_1> with assignment
814- rvalue_type = expr_type; // :TODO: data_type? smth else?
815- // qDebug() << dataTypeToString(symbol_table_.at(object_symbol_id).data_type, class_index) << "lvalue_type";
816- if (symbol_table_.at (object_symbol_id).data_type != rvalue_type) {
817- emit semantic_error (
818- -1 , QString (" (%1 and %2) %3" )
819- .arg (dataTypeToString (symbol_table_.at (object_symbol_id).data_type , class_index))
820- .arg (dataTypeToString (rvalue_type, class_index))
821- .arg (error_msg (E_TYPES_MISMATCH)));
822- }
823- break ;
824- }
825-
826848 // ...back to our finite-state machine
827849 for (int num = 0 ; num < rule.right_side .length (); num++) {
828850 states_stack.removeLast ();
@@ -836,8 +858,8 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
836858 result << action.index ;
837859 } else {
838860 // goto not defined
839- result.clear ();
840861 emit syntax_error (-1 , error_msg (E_INTERNAL_GOTO_UNDEFINED));
862+ result.clear ();
841863 return result;
842864 }
843865 break ;
@@ -856,8 +878,8 @@ QList<int> SSyntacticAnalyzer::process(QList<TokenPointer> tokens,
856878 }
857879 if (i >= tokens.length ()) {
858880 // tokens not accepted
859- result.clear ();
860881 emit syntax_error (-1 , error_msg (E_CHAIN_REJECTED));
882+ result.clear ();
861883 return result;
862884 }
863885
0 commit comments