Commit d894c3ec authored by Victor Yacovlev's avatar Victor Yacovlev

Fixed parsing constants with real overflow

parent a44afb7e
......@@ -3,24 +3,23 @@
"No one 'case'";"Нет ни одного “при”";"";"";"";"";
"Broken if statement";"Нет “все” для этой конструкции";"";"";"";"";
"Can't %1 %2 %3";"Нельзя “%1 %2 %3”";"";"";"";"";
"The name is used by other algorithm";"Имя занято другим алгоритмом";"";"";"";"";
"Assignment of non-returning algorithm";"У этого алгоритма нет значения";"";"";"";"";
"Too many ':=' operators";"Много “:=” в одной строке";"";"";"";"";
"Can't input string slice";"Нельзя ввести в вырезку";"";"";"";"";
"Use of 'not' for non-boolean value";"“не” вне логического выражения";"";"";"";"";
"Can't pass in-argument as in/out-argument";"Нельзя арг передать в рез или аргрез";"";"";"";"";
"Extra statement";"Строка не на месте";"";"";"";"";
"Wrong table constant";"";"";"";"";"";
"Unpaired ']'";"Нет парной “]”";"";"";"";"";
"Return valus is not a string";"Возвращаемая величина не строка";"";"";"";"";
"What to output?";"Что выводить?";"";"";"";"";
"Garbage in algorithm";"Лишние строки алгоритма";"";"";"";"";
"Assignment to array";"Присваивание массиву";"";"";"";"";
"Garbage between if..then";"Мусор между “если”..”то”";"";"";"";"";
"Extra open brace";"";"";"";"";"";
"Program structure error";"Ошибка структуры программы";"";"";"";"";
"No module name";"Нет имени исполнителя";"";"";"";"";
"Array dimension mismatch";"Несоответствие размерностей таблиц";"";"";"";"";
"Too big real value";"Слишком большое вещественное значение";"";"";"";"";
"No pairing 'begin module'";"Нет парной “исп”";"";"";"";"";
"Can't run kumir2-bc to compile this module";"Не могу запустить компилятор для сборки этого испонителя";"";"";"";"";
"No condition after 'if'";"Нет условия для “если”";"";"";"";"";
"No such module";"Нет такого исполнителя";"";"";"";"";
"No 'end' after 'then'";"Нет “все” после “то”";"";"";"";"";
"The name is used by global variable";"Имя занято глобальной величиной";"";"";"";"";
"Algorith out of module";"";"";"";"";"";
"Extra variable group specifier: %1";"Лишнее описание группы величин";"";"";"";"";
......@@ -34,7 +33,7 @@
"Can't integer:=charect";"Нельзя “цел := сим”";"";"";"";"";
"Can't charect:=integer";"Нельзя “сим := цел”";"";"";"";"";
"Can't boolean:=real";"Нельзя “лог := вещ”";"";"";"";"";
"Too many ':=' operators";"Много “:=” в одной строке";"";"";"";"";
"The name is used by other algorithm";"Имя занято другим алгоритмом";"";"";"";"";
"Variable already declared";"Величина уже описана";"";"";"";"";
"Can't boolean:=integer";"Нельзя “лог := цел”";"";"";"";"";
"Algorhitms can't return array";"Нельзя вернуть таблицу";"";"";"";"";
......@@ -84,7 +83,7 @@
"Can't input algorithm in- argument";"Нельзя ввести в аргумент";"";"";"";"";
"Then-value not specified";"Нет значения после “до”";"";"";"";"";
"Extra 'module'";"Для “исп” нет “кон_исп”";"";"";"";"";
"Array dimension must not be > 3";"Таблицы не бывают размерности > 3";"";"";"";"";
"No 'loop' before 'times'";"Перед “раз” нет “нц”";"";"";"";"";
"Extra ','";"Лишняя запятая";"";"";"";"";
"Garbage after 'switch' statement";"Мусор после “выбор”";"";"";"";"";
"Can't input constant";"";"";"";"";"";
......@@ -99,7 +98,7 @@
"No 'begin' after header";"После “алг” нет “нач”";"";"";"";"";
"This algorhitm is broken";"Алгоритм с ошибкой";"";"";"";"";
"No operand before non-unary operator";"";"";"";"";"";
"No such module";"Нет такого исполнителя";"";"";"";"";
"Can't run kumir2-bc to compile this module";"Не могу запустить компилятор для сборки этого испонителя";"";"";"";"";
"Extra 'switch'";"Нет ”все” после “выбор”";"";"";"";"";
"Error contains unpaired quote";"Непарная кавычка";"";"";"";"";
"Constant type mismatch";"Несоответствие типа константы";"";"";"";"";
......@@ -113,14 +112,14 @@
"Garbage at the end of statement";"Мусор в конце выражения";"";"";"";"";
"No 'then' after 'if'";"Где “то” после условия?";"";"";"";"";
"Assignment to complex expression";"Нельзя присвоить выражению";"";"";"";"";
"'end' instead of 'endloop'";"“кон” вместо “кц”";"";"";"";"";
"Can't output value of type %1";"Нельзя вывести значение типа %1";"";"";"";"";
"Can't real:=string";"Нельзя “вещ := лит”";"";"";"";"";
"Constant instead of name";"Здесь должно быть имя";"";"";"";"";
"Wrong hex constant";"Плохая 16-ричная константа";"";"";"";"";
"':=' or '=' ?";"“:=” или “=” ?";"";"";"";"";
"Unpaired quote";"Непарная кавычка";"";"";"";"";
"Array name not specified before '['";"Перед “[“ должно быть имя таблицы";"";"";"";"";
"No algorithm name";"Не указано имя алгоритма";"";"";"";"";
"Algorhitm not found";"Нет такого алгоритма";"";"";"";"";
"Can't input complex expression";"Нельзя ввести в выражение";"";"";"";"";
"Not a constant value";"Это не константа";"";"";"";"";
"Can't input function";"Нельзя ввести в алгоритм";"";"";"";"";
"Algorithm out of module";"Алгоритм вне исполнителя";"";"";"";"";
......@@ -130,20 +129,20 @@
"Extra docstring";"Здесь не должно быть строк описания";"";"";"";"";
"Extra brackets for algorithm without arguments";"Нет аргументов – не нужны скобки";"";"";"";"";
"Assignment to function";"Нельзя присвоить алгоритму";"";"";"";"";
"Wrong hex constant";"Плохая 16-ричная константа";"";"";"";"";
"Index is not integer";"Индекс – не целое число";"";"";"";"";
"Constant instead of name";"Здесь должно быть имя";"";"";"";"";
"Unmatched array dimensions";"Несоответствие размерностей таблиц";"";"";"";"";
"Operator in name";"Имя содержит оператор";"";"";"";"";
"Garbage afrer module name";"Мусор после имени исполнителя";"";"";"";"";
"Times value not specified";"Сколько раз?";"";"";"";"";
"Table dimension > 3";"";"";"";"";"";
"No for-loop variable";"Нет величины цикла";"";"";"";"";
"Left array bound is not integer";"Левая граница – не целое";"";"";"";"";
"No condition after 'case'";"Нет условия после “при”";"";"";"";"";
"Incompatible types";"Плохой тип параметра";"";"";"";"";
"'end_module' instead of 'end'";"“кон_исп” вместо “кон”";"";"";"";"";
"Array dimension mismatch";"Несоответствие размерностей таблиц";"";"";"";"";
"Initial value is empty";"Начальное значение не задано";"";"";"";"";
"'%1' in algorithm";"“%1” внутри алгоритма";"";"";"";"";
"Extra statement";"Строка не на месте";"";"";"";"";
"Extra open brace";"";"";"";"";"";
"Can't pass in-argument as in/out-argument";"Нельзя арг передать в рез или аргрез";"";"";"";"";
"Garbage between if..then";"Мусор между “если”..”то”";"";"";"";"";
"No such file";"Нет такого исполнителя рядом с программой";"";"";"";"";
"No loop 'to' value";"Нет “до” после “от”";"";"";"";"";
"Extra format";"";"";"";"";"";
......@@ -151,15 +150,15 @@
"Extra '['";"Лишняя “[“";"";"";"";"";
"Constant can not be a name";"Константа – это не имя";"";"";"";"";
"It is a garbage";"Это лишнее";"";"";"";"";
"Extra format parameter";"Лишний параметр вывода";"";"";"";"";
"No 'end' after 'then'";"Нет “все” после “то”";"";"";"";"";
"Not integer for-loop variable";"Величина не целая";"";"";"";"";
"No condition after 'if'";"Нет условия для “если”";"";"";"";"";
"Slice of string array, but not string";"Вырезка не из строки, а из таблицы";"";"";"";"";
"Void argument";"Пустой аргумент";"";"";"";"";
"What to input?";"Куда вводить?";"";"";"";"";
"Can't input complex expression";"Нельзя ввести в выражение";"";"";"";"";
"Algorhitm not found";"Нет такого алгоритма";"";"";"";"";
"Left array bound not specified";"Не указана левая граница таблицы";"";"";"";"";
"Array input must not be in a list";"";"";"";"";"";
"Unmatched array dimensions";"Несоответствие размерностей таблиц";"";"";"";"";
"Index is not integer";"Индекс – не целое число";"";"";"";"";
"Unpaired ')'";"Непарная скобка";"";"";"";"";
"Extra variable group out-specifier";"Лишний “рез”";"";"";"";"";
"No 'loop' before 'while'";"Перед “пока” нет “нц”";"";"";"";"";
......@@ -177,13 +176,14 @@
"Extra 'else'";"Лишнее “иначе”";"";"";"";"";
"Extra 'begin'";"Нет “кон” после “нач”";"";"";"";"";
"Extra variable group inout-specifier";"Лишний “аргрез”";"";"";"";"";
"Can't -%1";"Нельзя -%1";"";"";"";"";
"Extra indeces in slice";"Лишние индексы в вырезке";"";"";"";"";
"Can't integer:=%1";"";"";"";"";"";
"No pairing '('";"Нет парной “(“";"";"";"";"";
"Unpaired '['";"Не парная “[“";"";"";"";"";
"Can't pass this expression as in/out-argumeny";"Не величина в аргрез-параметре";"";"";"";"";
"Must be a scalar constant";"";"";"";"";"";
"What to input from file?";"Куда вводить из файла?";"";"";"";"";
"Wrong E-real number";"Ошибка в E-записи числа";"";"";"";"";
"'end_module' instead of 'end'";"“кон_исп” вместо “кон”";"";"";"";"";
"Extra 'end'";"Лишний “кон”";"";"";"";"";
"Algorhitm header in algorhitm body";"Вложенное описание алгоритма";"";"";"";"";
"Not a simple index";"Индекс – не число";"";"";"";"";
......@@ -191,26 +191,26 @@
"Name contains quotation symbol";"Имя содержит кавычку";"";"";"";"";
"Not enought algorithm arguments";"Мало аргументов";"";"";"";"";
"Can't charect:=boolean";"Нельзя “сим := лог”";"";"";"";"";
"No 'loop' before 'times'";"Перед “раз” нет “нц”";"";"";"";"";
"No 'loop' before 'for'";"Перед “для” нет “нц”";"";"";"";"";
"Array dimension must not be > 3";"Таблицы не бывают размерности > 3";"";"";"";"";
"Wrong E-real number";"Ошибка в E-записи числа";"";"";"";"";
"Extra 'if'";"Нет “то..все” после “если”";"";"";"";"";
"Can't %1:=real";"";"";"";"";"";
"No condition between 'case' and colon";"Нет условия между “при” и “:”";"";"";"";"";
"No then before else";"Нет “то” перед “иначе”";"";"";"";"";
"Assignment of array";"Нельзя присваивать таблицы";"";"";"";"";
"Extra 'not'";"Лишнее “не”";"";"";"";"";
"Can't output value of type %1";"Нельзя вывести значение типа %1";"";"";"";"";
"'end' instead of 'endloop'";"“кон” вместо “кц”";"";"";"";"";
"Keyword in name";"Ключевое слово в имени";"";"";"";"";
"Can't input an array";"";"";"";"";"";
"What to output to file?";"Что выводить в файл?";"";"";"";"";
"No 'case' after 'switch'";"Нет “при:” после “выбор”";"";"";"";"";
"Can't %1:=charect";"";"";"";"";"";
"= instead of :=";"";"";"";"";"";
"Times value not specified";"Сколько раз?";"";"";"";"";
"Garbage afrer module name";"Мусор после имени исполнителя";"";"";"";"";
"Array element in array bound";"Элемент таблицы в границе";"";"";"";"";
"Can't string:=%1";"";"";"";"";"";
"First unnamed algorithm should not return anything";"Алгоритм без имени ничего не возвращает";"";"";"";"";
"Not integer for-loop variable";"Величина не целая";"";"";"";"";
"Extra format parameter";"Лишний параметр вывода";"";"";"";"";
"No left array bound";"Нет левой границы таблицы";"";"";"";"";
"Integer constant too big";"Слишком большое целое число";"";"";"";"";
"Literal can't be part of name";"Константа в имени";"";"";"";"";
......@@ -221,11 +221,12 @@
"Can't string:=real";"Нельзя “лит := вещ”";"";"";"";"";
"No 'from'..'to'.. after variable";"Нет “от”..”до”.. после величины";"";"";"";"";
"Forgotten operator after bracket";"Перед выражением пропущен оператор";"";"";"";"";
"Can't -%1";"Нельзя -%1";"";"";"";"";
"No 'loop' before 'for'";"Перед “для” нет “нц”";"";"";"";"";
"Can't pass in-argument as out-argument";"Нельзя арг передать в рез или аргрез";"";"";"";"";
"Condition after '%1' not boolean";"Условие после “%1” не логическое";"";"";"";"";
"Can't integer:=real";"Нельзя “цел := вещ”";"";"";"";"";
"Array required here";"Индексы не нужны";"";"";"";"";
"Garbage between alg..begin";"Мусор между “алг”..”нач”";"";"";"";"";
"No condition after 'end if'";"Нет условия для “кц при”";"";"";"";"";
"Assignment of void";"Нельзя присвоить пустое значение";"";"";"";"";
"Loop type not specified";"Не указан тип цикла";"";"";"";"";
......@@ -252,6 +253,7 @@
"No loop variable";"Не указана величина цикла";"";"";"";"";
"Name contains keyword";"Ключевое слово в имени";"";"";"";"";
"Constant value not typed";"Не введено значение константы";"";"";"";"";
"Wrong real number";"Ошибка в записи числа";"";"";"";"";
"Here must be \"input\" or \"output\"";"";"";"";"";"";
"Hidden part must contain only algorithm";"Скрытый текст может содержать только алгоритмы";"";"";"";"";
"Can't string:=integer";"Нельзя “лит := цел”";"";"";"";"";
......@@ -274,8 +276,8 @@
"Garbage between switch..case";"Мусор между “выбор”..”при”";"";"";"";"";
"No expressions after '%1'";"Нет величин после “%1”";"";"";"";"";
"Not integer times-value";"Величина не целая";"";"";"";"";
"Unpaired '['";"Не парная “[“";"";"";"";"";
"Garbage between alg..begin";"Мусор между “алг”..”нач”";"";"";"";"";
"No pairing '('";"Нет парной “(“";"";"";"";"";
"Assignment of non-returning algorithm";"У этого алгоритма нет значения";"";"";"";"";
"Bad symbol in name";"Имя содержит недопустимый символ";"";"";"";"";
"What to assign?";"Что назначать?";"";"";"";"";
"No condition after 'loop while'";"Нет условия после “нц пока”";"";"";"";"";
......
......@@ -2519,64 +2519,34 @@ QVariant SyntaxAnalizerPrivate::parseConstant(const std::list<Lexem*> &constant
//integerOverflow = !StdLib::IntegerOverflowChecker::checkFromString(val);
// TODO check integer value from string
}
if (ct==AST::TypeReal) {
static const QString expFormSymbols = QString::fromUtf8("eEеЕ01234567890");
bool result = val.length()>0 && (val[0].isDigit() || val[0]=='.');
bool dotFound = false;
bool signFound = false;
bool eFound = false;
for (int i=0; i<val.length(); i++) {
if (val[i]=='.') {
if (!dotFound) {
dotFound = true;
}
else {
result = false;
break;
}
}
else if (val[i]=='+' || val[i]=='-') {
if (!signFound) {
signFound = true;
}
else {
result = false;
break;
}
}
else if (val[i]=='e') {
if (!eFound) {
eFound = true;
}
else {
result = false;
break;
}
}
else if (!expFormSymbols.contains(val[i])) {
result = false;
break;
}
if (ct==AST::TypeReal ||
(pt==AST::TypeReal || integerOverflow)
)
{
ct = AST::TypeReal;
Kumir::Converter::ParseError local_error = Kumir::Converter::NoError;
Kumir::real value = Kumir::Converter::parseReal(val.toStdWString(), Kumir::Char('.'), local_error);
QString err;
if (local_error==Kumir::Converter::WrongReal) {
err = _("Wrong real number");
}
else if (local_error==Kumir::Converter::WrongExpForm) {
err = _("Wrong E-real number");
}
if (!result) {
else if (local_error==Kumir::Converter::BadSymbol) {
err = _("Wrong real number");
}
else if (local_error==Kumir::Converter::Overflow) {
err = _("Too big real value");
}
if (err.length()>0) {
for (std::list<Lexem*>::const_iterator it = constant.begin(); it!=constant.end(); it++) {
Lexem * lx = * it;
lx->error = _("Wrong E-real number");
lx->error = err;
return QVariant::Invalid;
}
}
}
if (pt==AST::TypeReal || integerOverflow) {
// if (!StdLib::DoubleOverflowChecker::checkFromString(val)) {
// for (std::list<Lexem*>::const_iterator it = constant.begin(); it!=constant.end(); it++) {
// Lexem * lx = * it;
// lx->error = _("Real constant too big");
// }
// return QVariant::Invalid;
// }
// TODO check real value for overflow
ct = AST::TypeReal;
return QVariant(value);
}
if (pt==AST::TypeInteger && integerOverflow) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment