方案语言用于为 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 操作系统和 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 需要一个空格来分隔事物。关键字,变量和右括号和左括号在很多情况下必须用空格隔开,但我不能说“全部”情况。仅供参考,目前我不关心这种详细程度。