按照语法编写了这个“编译器”(对于解释性语言而言“编译”二字的确很奇怪)。

  功能:

    1.“编译”、运行一个后缀为 '.bf' 的文件;

    2.提供错误指示,目前包括 RE 和 CE ;

    3.提供 'help' 的指令帮助;

    4.提供文件打开的功能(使用 Windows 下的记事本,所以本程序是仅限 Windows 使用的......);

  源码:

#include <conio.h>
#include <windows.h>
#include <bits/stdc++.h>
using namespace std; typedef bool ( * Functions )();
typedef pair<int, int> pii; const char *LoadingBar[11] =
{
" ",
"- ",
"-- ",
"--- ",
"---- ",
"----- ",
"------ ",
"------- ",
"-------- ",
"--------- ",
"----------" };
const int MAXN = 1e6 + 5; pii pos[MAXN];
int stk[MAXN], cp[MAXN], top;
int val[MAXN] = {}, ed[MAXN];
char code[MAXN], buf[MAXN];
int len, cnt; namespace Error
{
void PrintPosition( const int cur, char ptr )
{
int r = pos[cur].first;
int beg = ed[r - 1] + 1, eed = ed[r];
for( int i = max( beg, cur - 3 ) ; i <= min( eed, cur + 3 ) ; i ++ ) putchar( code[i] );
putchar( '\n' ); for( int i = max( beg, cur - 3 ) ; i < cur ; i ++ ) putchar( ' ' );
putchar( ptr ), putchar( '\n' );
} void RE( const int cur )
{
printf( "Runtime error on: Line %d, Character %d.\n", pos[cur].first, pos[cur].second );
printf( "Error: out of memory.\n" );
PrintPosition( cur, 'x' ), putchar( '\n' );
} void CE( const int cur, bool type )
{
printf( "Compilation error on: Line %d, Character %d.\n", pos[cur].first, pos[cur].second );
printf( "Mismatched %s bracket.\n", type ? "right" : "left" );
PrintPosition( cur, '?' ), putchar( '\n' );
} void UF()
{
puts( "Unknown file name." );
} void UC()
{
puts( "Unknown command. Please put in \'help\' for help." );
} void UnknownFormat()
{
puts( "Unknown format, please input \'help\' for help.\n" );
}
}; using namespace Error; namespace Function
{
bool Compile()
{
bool flag; int lst = 0;
printf( "Processing: [%s]: 0%%\n", LoadingBar[0] );
for( int i = 1 ; i <= len ; i ++ )
{
if( code[i] == '[' ) stk[++ top] = i;
if( code[i] == ']' )
{
cp[i] = stk[top], cp[stk[top --]] = i;
if( top < 0 ) { CE( i, 1 ); return false; }
} flag = false;
while( lst < 10 && lst + 1 < 10.0 * i / len ) flag = true, lst ++;
if( flag ) printf( "Processing: [%s]: %.1lf%%\n", LoadingBar[lst], 100.0 * i / len );
} if( top ) { CE( stk[1], 0 ); return false; }
puts( "Done!\n" );
return true;
} FILE* GetFile( string Name )
{
int L = Name.size(); len = cnt = 0;
for( int i = 0 ; i < L ; i ++ ) buf[i] = Name[i];
buf[L] = '.', buf[L + 1] = 'b', buf[L + 2] = 'f';
FILE *source = fopen( buf, "r" );
for( int i = 0 ; i < L + 5 ; i ++ ) buf[i] = '\0';
return source;
} int GetCode( string Name )
{
FILE *source = GetFile( Name );
if( source == NULL ) { UF(), fclose( source ); return 0; } while( ~ fscanf( source, "%s", buf + 1 ) )
{
cnt ++;
for( int i = 1 ; buf[i] && buf[i] != '\r' && buf[i] != '\n' ; i ++ )
code[++ len] = buf[i], pos[len] = pii( cnt, i );
for( int i = 1 ; buf[i] ; i ++ ) buf[i] = '\0';
ed[cnt] = len;
} fclose( source );
return 1;
} bool CheckOrder( string A, string B )
{
if( A.length() < B.length() ) return false;
for( int i = 0 ; i < B.length() ; i ++ )
if( A[i] != B[i] ) return false;
return true;
}
}; using namespace Function; struct Interface
{
public :
int act();
}; struct Basic : public Interface
{
private :
bool Help()
{
puts(
"Command - Use\n\
help Show the usable commands.\n\
quit Quit the program.\n\
exit Exactly the same as command \"quit\".\n\
run Compile and run a file with suffix \".bf\".\n\
Format:\n\
run [File Name]\n\
open Open a file with suffix \".bf\".\n\
Format:\n\
open [File Name]\n\
clean Clean the screen.\n" );
return false;
} bool Run()
{
puts( "Running..." );
Sleep( 300 ); int ptr = 0;
memset( val, 0, sizeof val ); clock_t start = clock();
for( int i = 1 ; i <= len ; i ++ )
{
if( code[i] == '>' ) { ptr ++; if( ptr == MAXN ) { RE( i ); return false; } }
else if( code[i] == '<' ) { ptr --; if( ptr < 0 ) { RE( i ); return false; } }
else if( code[i] == '+' ) val[ptr] ++;
else if( code[i] == '-' ) val[ptr] --;
else if( code[i] == '.' ) putchar( val[ptr] );
else if( code[i] == ',' ) val[ptr] = getchar();
else if( code[i] == '[' ) { if( val[ptr] == 0 ) i = cp[i]; }
else if( code[i] == ']' ) { if( val[ptr] ) i = cp[i]; }
} clock_t ed = clock();
puts( "\n--------------------------------------------------" );
printf( "Run Time: %lfs\n\n", ( double ) ( ed - start ) / CLOCKS_PER_SEC ); return true;
} void CompileAndRun( const string order )
{
string name;
stringstream ss( order );
ss >> name;
if( ! ( ss >> name ) ) { UnknownFormat(); return ; }
if( ss >> name ) { UnknownFormat(); return ; } if( ! GetCode( name ) ) return ;
if( Compile() ) Run();
} void OpenFile( const string order )
{
string name;
stringstream ss( order );
ss >> name;
if( ! ( ss >> name ) ) { UnknownFormat(); return ; }
if( ss >> name ) { UnknownFormat(); return ; } FILE *source = GetFile( name );
if( source == NULL ) { UF(), fclose( source ); return ; }
fclose( source );
system( ( "notepad " + name + ".bf" ).c_str() );
} public :
int act()
{
string comm;
while( true )
{
system( "cls" );
cout << "Brain Fuck Environment : Version : 1.1.0" << endl;
while( true )
{
cout << "BFE > ";
getline( cin, comm, '\n' );
if( comm == "debug" ) return 2;
else if( comm == "quit" || comm == "exit" ) goto quit;
else if( CheckOrder( comm, "run" ) ) CompileAndRun( comm );
else if( CheckOrder( comm, "open" ) ) OpenFile( comm );
else if( comm == "clean" ) break;
else if( comm == "help" ) Help();
else UC();
}
}
quit :
return 0;
}
}base; struct Debuger : public Interface
{
private :
void Help()
{
puts(
"Command - Use\n\
help Show the usable Commands.\n\
quit Quit the debuger.\n\
exit Exactly the same as command \"quit\".\n" );
}
public :
int act()
{
string comm;
while( true )
{
system( "cls" );
cout << "Brain Fuck Environment :: Debuger : Version : 0.0.0" << endl;
while( true )
{
cout << "Debuger > ";
getline( cin, comm, '\n' );
if( CheckOrder( comm, "help" ) ) Help();
else if( CheckOrder( comm, "quit" ) ) goto quit;
else if( CheckOrder( comm, "exit" ) ) goto quit;
}
}
quit :
return 1;
}
}debug; struct End : public Interface
{
public :
int act() { exit( 0 ); return 0; }
}finish; int main()
{
system( "@echo off" );
int cur = 1;
while( true )
{
if( cur == 0 ) cur = finish.act();
if( cur == 1 ) cur = base.act();
if( cur == 2 ) cur = debug.act();
}
return 0;
}

BrainF**k的编译器的更多相关文章

  1. Brainf**k(一位数求max)

    题目大意:给你两个一位数,要你求出其中的较大值(使用$Brainf**k$) ($Brainf**k$简介,相当于有一个数组和一个指针,","为把数组当前位赋值为读入的数,&quo ...

  2. BT雷人的程序语言

    原文:http://cocre.com/?p=1142  酷壳 这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样.编程语言方面,看过本站<6个变态的C语言Hello Worl ...

  3. 6个变态的C语言Hello World程序 之 雷人的程序语言

    以下的六个程序片段主要完毕这些事情: 输出Hello, World 混乱C语言的源码 以下的全部程序都能够在GCC下编译通过,仅仅有最后一个须要动用C++的编译器g++才干编程通过. hello1.c ...

  4. CTF中那些脑洞大开的加密(1)

    0x01 目录 各种文本加密             Shell   1 2 3 4 5 6 7 8 9 10 11 12 换位加密:     1.栅栏密码(Rail-fence Cipher)    ...

  5. c语言数据问题

    变量都有作用域,链接属性,和存储类型3个属性,这三个属性决定了变量的作用域和生存期的问题 在c语言中包含4中类型, 整形 浮点型 指针 聚合类型(数组,结构体等) ------------------ ...

  6. CTF中那些脑洞大开的编码和加密

    0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进 ...

  7. 深入浅出C++引用(Reference)类型

    要点1:为反复使用的.冗长的变量名称定义一个简短的.易用的别名,从而简化了代码.通常,冗长的变量名称源于多层嵌套对象,例如类中定义嵌套类,类中定义其它类对象. //------ 未使用引用的程序片段, ...

  8. Java的面向对象思想

    多态性: 一种方法有多种实现,采用哪一种实现由Java虚拟机在运行时动态决定,这种能力成为动态绑定(dynamic binding),也称为多态性(polymorphism)(源于一个希腊单词,意为“ ...

  9. BZOI 1507 [NOI2003] Editor

    Background After trying to solve problem EDIT1(Editor) and being ****ed by Brainf**k, Blue Mary deci ...

随机推荐

  1. logger日志接口SLF4J

    SLF4J只是一个接口,可以实现程序的解藕.SLF4J可以与log4j.logback.jdk等日志系统结合,以及在这些日志系统之间切换. 使用maven导入各个日志系统的jar包.需要注意的是要写相 ...

  2. BZOJ1077 并查集

    1077: [SCOI2008]天平 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 416  Solved: 224[Submit][Status][ ...

  3. SQL server数据库的密码策略与登录失败锁定策略

    SQL server数据库本身没有密码复杂度策略设置,它是使用Windows操作系统的校验函数来校验账户密码的,所以查看SQL server数据库密码复杂度需要结合操作系统本地安全策略的密码策略来看. ...

  4. [VuePress]个人博客 -- 批处理自动化编译提交 -- 排错记录

    建了一个VuePress的个人博客 想着写个批处理,自动编译并上传到GitHub. 结果遇到两个问题, 一个是,vuepress build docs编译后,这个命令执行完就exit了 研究了下bat ...

  5. samba修复

    在之前有讲过一个samba无法连接的情况,这次碰到的是samba依赖被弄坏后还原. 注:可能不是很详细,因为时间原因,可能不够完整或缺少记录和截图. 作为记录和参考. 问题:因为对ubuntu系统不太 ...

  6. 缓冲区(Buffer)的数据存取

    缓冲区(Buffer) 1. 缓冲区(Buffer):一个用于特定基本数据类 型的容器. 由 java.nio 包定义的,所有缓冲区 都是 Buffer 抽象类的子类.2. Java NIO 中的 B ...

  7. uwsgi+nginx 502 bad get away 错误

    用uwsgi和nginx部署网站时有时候访问网站会出现502错误 配置,启动文件等完全没有问题. 目前解决方法是重启uwsgi就可以了(虽然说502错误应该有很多产生原因啦) 所用命令: $ ps - ...

  8. 深入理解JVM(③)——之HotSpot虚拟机对象探秘

    前言 上篇文章介绍了Java虚拟机的运行时数据区域,大致明白了Java虚拟机内存模型的概况,下面就基于实用优先的原则,以最常用的虚拟机HotSpot和最常用的内存区域Java堆为例,升入探讨一下Hot ...

  9. ActiveMQ 笔记(一)概述与安装

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.消息中间件的产生背景 1.前言:考虑消息中间件的使用场景? 在何种场景下需要使用消息中间件 为什么要 ...

  10. (Java实现) 数塔问题

    数塔问题(使用动态规划思路求解) 如图所示,给定一个正整数构成的三角形,如下所示: 在下面的数字三角形中寻找一条从顶部到底边的路径, 使得路径上所经过的数字之和最大. 路径上的每一步都只能往左下或者右 ...