BrainF**k的编译器
按照语法编写了这个“编译器”(对于解释性语言而言“编译”二字的确很奇怪)。
功能:
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的编译器的更多相关文章
- Brainf**k(一位数求max)
题目大意:给你两个一位数,要你求出其中的较大值(使用$Brainf**k$) ($Brainf**k$简介,相当于有一个数组和一个指针,","为把数组当前位赋值为读入的数,&quo ...
- BT雷人的程序语言
原文:http://cocre.com/?p=1142 酷壳 这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样.编程语言方面,看过本站<6个变态的C语言Hello Worl ...
- 6个变态的C语言Hello World程序 之 雷人的程序语言
以下的六个程序片段主要完毕这些事情: 输出Hello, World 混乱C语言的源码 以下的全部程序都能够在GCC下编译通过,仅仅有最后一个须要动用C++的编译器g++才干编程通过. hello1.c ...
- CTF中那些脑洞大开的加密(1)
0x01 目录 各种文本加密 Shell 1 2 3 4 5 6 7 8 9 10 11 12 换位加密: 1.栅栏密码(Rail-fence Cipher) ...
- c语言数据问题
变量都有作用域,链接属性,和存储类型3个属性,这三个属性决定了变量的作用域和生存期的问题 在c语言中包含4中类型, 整形 浮点型 指针 聚合类型(数组,结构体等) ------------------ ...
- CTF中那些脑洞大开的编码和加密
0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进 ...
- 深入浅出C++引用(Reference)类型
要点1:为反复使用的.冗长的变量名称定义一个简短的.易用的别名,从而简化了代码.通常,冗长的变量名称源于多层嵌套对象,例如类中定义嵌套类,类中定义其它类对象. //------ 未使用引用的程序片段, ...
- Java的面向对象思想
多态性: 一种方法有多种实现,采用哪一种实现由Java虚拟机在运行时动态决定,这种能力成为动态绑定(dynamic binding),也称为多态性(polymorphism)(源于一个希腊单词,意为“ ...
- BZOI 1507 [NOI2003] Editor
Background After trying to solve problem EDIT1(Editor) and being ****ed by Brainf**k, Blue Mary deci ...
随机推荐
- tomcat启动失败怎么回事?
1.系统环境没有配置好 2.web.xml文件里有错误拼写
- tp5插入百万条数据处理优化
<?php namespace app\index\controller; use think\Controller; use think\Db; class Charu extends Con ...
- zepto快速入门教程
* zepto* 特点:1.体积8kb2.针对移动端的框架3.语法同jquery大部分一样,都是$为核心函数4.目前功能完善的框架体积最小的左右* 同jquery相似的语法核心:$--作为函数使用参数 ...
- Charles截获iPhone网络请求
Charles介绍:Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,有时为了调试与服务器端的网络通讯协议,常常需要服务端原因一起调试.有了Charles客户端人员自娱自乐了,想怎 ...
- 【转】网页的title左边的小图片怎么添加
首先,代码中的title标签里是不能加图片的.但是浏览器标提栏前面是可以加一个小图标的. 解决方案:第一步,做一个16 X 16像素的ico格式的图标.具体操作方法是,先在Photoshop中做一个透 ...
- DCL单例为什么要加Volatile
拿一个对象创建赋值来说 class T{ int elem = 1; } T t = new T(); 上段代码转换成汇编码为: 0 new #2 <T> 3 dup 4 invokesp ...
- vue-组件化-插槽(slot)
理解 Vue组件化中,当我们在设计一个组件的时候,可能会保留一部分,让使用者自定义的内容,比如: 导航栏组件中,右上角的分享按钮,左上角做菜单按钮 弹出框组件中,弹出框的提示内容等 ... 在这种场景 ...
- Java实现 LeetCode 449 序列化和反序列化二叉搜索树
449. 序列化和反序列化二叉搜索树 序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法 ...
- Java实现 蓝桥杯 算法训练 字符串合并
试题 算法训练 字符串合并 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入两个字符串,将其合并为一个字符串后输出. 输入格式 输入两个字符串 输出格式 输出合并后的字符串 样例 ...
- java中Condition类的详细介绍(详解)
已找不到原文了,还望原文博主看到能告诉小白一下,一定标注原文地址 一 condition 介绍及demo Condition是在java 1.5中才出现的,它用来替代传统的Object的wait(). ...