Язык схемы используется для построения управляющих файлов для программы Meep. Почти все ошибки моего файла управления Meep происходят из-за несовпадающих скобок, которые Meep распознает после полной обработки файла управления, то есть в конце файла управления и не очень помогает.
Проверка скобок звучит легко, за исключением того, что в этом приложении оператор может выполнять полстраницы длиной от 50 до 100 наборов вложенных скобок, поэтому проверка глазного яблока очень сложна. Кроме того, запись неправильно отформатированного оператора (пропуская «)») не обнаруживается, если в другом месте в операторе возникает дополнительный «)», но, конечно, Meep не работает так, как ожидалось в этом случае.
Существуют определенные структуры с управляющими файлами Meep, для которых все круглые скобки должны быть закрыты, (! Set … (make … (list … (run …, для примеров.) Я хочу написать программу препроцессора в C ++, который проверяет наличие закрытых «(…)» наборов в этих и других операторах в моих управляющих файлах. У меня есть начало, но я застрял на логике общего подхода.
Я перешел от исходного кода, теперь он выглядит следующим образом. Файл Mit-Scheme теперь успешно записывается в буфер. Должен ли я попытаться выполнить поиск в буфере несколько раз последовательно, чтобы найти ключевые слова, а затем рассчитать их порядок, или я должен искать в буфере параллельно, ища следующее ключевое слово?
Функциональный оператор управления Meep выглядит следующим образом:
// read a file into memory
#include <iostream> // std::cout
#include <fstream> // std::ifstream
#include <string>
using namespace std;
#include <vector>
#include <limits>
void pause() {
cout << "Press ENTER to continue...";
cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
}
int main () {
std::string name;
std::string quit = "quit";
std::ifstream is;
do
{
std::string quit = "quit";
std::string name;
std::cout << "Please, enter your file name: --or quit: ";
std::getline (std::cin,name);
if(name==quit) return 1;
std::cout << "Hello, " << name << '\n';
pause();
is.open(name.c_str(),ios::in | std::ifstream::binary); }
while (!is) ;// get length of file:
is.seekg (0, is.end);
int length = is.tellg();
is.seekg (0, is.beg);
// allocate memory:
char * buffer = new char [length];
// read data as a block:
is.read (buffer,length);
is.close();
// print content:
std::cout.write (buffer,length);
delete[] buffer;
return 0;
Я использую Ubuntu 14.10 OS и компилятор g ++.
Какая логика кода лучше всего подходит для сканирования каждой строки управляющего файла, игнорирования пробелов и комментариев (от; до eol), обнаружения «(» и «)» в операторах и вывода номера строки (или строки), когда выполняется условие требуется «)» возникает?
Вот одно утверждение.
(set! geometry
(if no-bend?
(list
(make block
(center 0 wvg-ycen)
(size infinity w infinity)
(material (make dielectric (epsilon 12)))))
(list
(make block
(center (* -0.5 pad) wvg-ycen)
(size (- sx pad) w infinity)
(material (make dielectric (epsilon 12))))
(make block
(center wvg-xcen (* 0.5 pad))
(size w (- sy pad) infinity)
(material (make dielectric (epsilon 12)))))))
О, и я на самом деле ошибся, написав, что пустое пространство игнорируется. Это не. Пустые строки пробела в порядке, но контрольный файл и я думаю, что Mit-Scheme требует пробела, разделяющего вещи. Ключевые слова, переменные и закрывающая и открывающая скобки должны быть разделены пробелом во многих обстоятельствах, но я не могу сказать «все» обстоятельства. Просто для вашего сведения, я не беспокоюсь об этом уровне детализации в настоящее время.
Задача ещё не решена.