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

  功能:

    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. .Net基础之5——复杂数据类型

    (1)复习 1.变量 int  double   string   char   bool    decimal 变量的使用规则:先声明再赋值最后使用 2.Camo      Pascal 3.运算符 ...

  2. 查找最大元素(hdu2025)

    输入方式:直接循环输入不带空格的未知长度的字符串. 思考:直接循环输入未知长度的字符串,用while(gets_s()),循环内外不用getchar().(注意,每次字符串都是以整体输入) #incl ...

  3. Spring全家桶一一SpringBoot与Mybatis

    Spring全家桶系列一一SpringBoot与Mybatis结合 本文授权"Java知音"独家发布. Mybatis 是一个持久层ORM框架,负责Java与数据库数据交互,也可以 ...

  4. Java效率工具Lombok使用与原理

    Java效率工具Lombok使用与原理 我个人觉得 Lombok是一个优化Java代码以及提升开发效率不错的工具.Lombok 的Github地址为:https://github.com/rzwits ...

  5. java中碰到的异常

    mapper接口中找不到相应方法 解决:配置xml读取路径错误 org.apache.ibatis.binding.BindingException: Invalid bound statement ...

  6. JS 写逻辑判断,不要只知道用 if-else 和 switch

    我们在编写 JS 代码时,经常会遇到逻辑判断复杂的情况.一般情况下,可以用 if/else 或 switch 来实现多个条件判断,但会出现一个问题:随着逻辑复杂度的增加,代码中的 if/else 和 ...

  7. 01.Django-基础

    基础 1. 简介 Django是一个由Python写成的开放源代码的重量级Web应用框架. Django的目的是使常见的Web开发任务,快速和容易 2. 特点 MVC开发模式 内置进行快速web开发所 ...

  8. Linux,Mac下MySQL的安装及一些知识点的整理

    Linux下载安装 在服务器上下载的话,需要安装Mysql5.7相关的yum源 wget https://dev.mysql.com/get/mysql80-community-release-el7 ...

  9. 【Ubuntu】快捷键

    版本:Ubuntu18.04 1. 终端(terminal ) alt + ctrl + t # 打开终端 shift + shift + t # 新建终端标签页 ctrl + c # 强制停止程序运 ...

  10. [Objective-C] 009_Foundation框架之NSDictionary与NSMutableDictionary

    在Cocoa Foundation中NSDictionary和NSMutableDictionary 用于对象有序集合,NSDictionary和NSMutableDictionary 与 NSArr ...