Это происходит из-за того, что неявный фид строки, также известный как символ новой строки \n
, добавляется ко всем пользовательским вводам терминала, поскольку он сообщает потоку начать новую строку. Вы можете смело учитывать это, используя std::getline
при проверке нескольких строк ввода пользователя. Поведение по умолчанию std::getline
будет читать все до и включая символ новой строки \n
из объекта входного потока, который в этом случае является std::cin
.
#include
#include
int main()
{
std::string name;
std::string state;
if (std::getline(std::cin, name) && std::getline(std::cin, state))
{
std::cout << "Your name is " << name << " and you live in " << state;
}
return 0;
}
blockquote >Input: "John" "New Hampshire" Output: "Your name is John and you live in New Hampshire"
Есть несколько комплектов тестов компилятора. Нам посчастливилось использовать тестовый набор Plum Hall для компилятора C. Он состоит из большого набора C-кода, специально написанного для тестирования по языковому стандарту. Он проверяет, что компилятор может обрабатывать синтаксис и семантику языка.
Общая практика заключается в создании большого набора небольших программ, каждый из которых демонстрирует одни аспекты компилятора. Они будут включать как компиляцию программы, так и те, которые не должны. Генерал ASM, выходящий из задней части, не проверяется, а скорее запускается программа и проверяется выход. Что касается того, как убедиться, что в тестовых случаях нет ошибок: сделайте их маленькими, как и по 5-10 строк.
Эти тестовые комплекты могут быть очень большими, как в сотнях до тысяч тестов (для пример: устаревший набор тестов для языка программирования D ) и обычно включают один или несколько тестовых примеров для каждой ошибки, когда-либо сообщаемой.
Компилятор Eiffel является открытым исходным кодом и имеет обширную библиотеку тестовых примеров и внутренних контрактов на проектирование.
Ранее был задан вопрос, связанный с этим для C , но он сводится к тщательно составленному тестовому набору компиляторов.
Что касается того, когда компиляторы неправильно кода, я Спасибо, что достаточно часто в моей профессиональной карьере, спасибо. Это случалось все меньше и меньше с течением времени, но я нашел ошибку в компиляторах MS C ++, нацеленных на CLI на этой неделе.
Идея скомпилировать большой проект с открытым исходным кодом:
Вы можете взять проект, в котором есть набор тестов. Затем вы скомпилируете проект и его тестовый набор и посмотрите, проходят ли тесты. Чтобы проверить эти результаты, вы компилируете проект и набор тестов с другим компилятором и снова запускаете тесты.
GCC имеет довольно большой набор тестов ( https://gcc.gnu.org/onlinedocs/gccint/Testsuites.html#Testsuites ). Он доступен в SCM: https://github.com/gcc-mirror/gcc/tree/master/gcc/testsuite
Хорошие тестовые наборы для реальных языков дороги для создания и обслуживания. Причина в том, что набор тестов Plum Hall , который является отраслевым стандартом для ANSI & nbsp; C, настолько кровавый.
Проверка перевода Джорджа Некулы блестящая идея, но также довольно дорогостоящая.
Единственное, что дешево и просто: поддерживать набор регрессионных тестов, и каждый раз, когда вы исправляете ошибку в своем компиляторе, поместите подходящий тест в ваши регрессионные сюиты. С компиляторами невероятно, насколько легко продолжать повторять одну и ту же ошибку снова и снова. Дисциплинированные дополнения к вашему набору регрессии предотвратят это, и они не будут стоить дорого.