Skip to content

Commit caf7bf6

Browse files
committed
fix checking for mismatched types
1 parent 41636ba commit caf7bf6

File tree

2 files changed

+62
-39
lines changed

2 files changed

+62
-39
lines changed

src/ssyntacticanalyzer.cpp

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
342363
bool 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

src/ssyntacticanalyzer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class SSyntacticAnalyzer : public QObject
6464
SymbolType type,
6565
int block_index,
6666
QList<int> declared_but_not_in_block_indexes);
67+
bool checkIfTypesMatch(const int object_symbol_id, const DataType rvalue_type, const int class_index);
6768

6869
signals:
6970
void syntax_error(int pos, QString msg);

0 commit comments

Comments
 (0)