1

Befunge-93でプログラムを保存してコンパイルするにはどうすればよいですか?fileName.whatファイルを(のように)保存するために必要なファイル拡張子は何ですか?では、どうすればコンパイルできますか?

4

2 に答える 2

5

Befungeは通常インタプリタ言語です。実際、プログラムは自己変更型であるため、コンパイルが困難になるように設計されています(ただし、コンパイラーの作成を阻止することはできません)。

ファイルを好きなように保存し(.bf通常は拡張子が使用されます)、ファイル名をコマンドライン引数として渡してインタプリタ(bef)を実行する必要があります。

インタプリタのソースコードで使用方法を確認できます。

于 2010-04-08T20:42:43.963 に答える
0

インタプリタ言語であるため、通常はコンパイルされません。以下のAC#Befunge 93インタープリターは、コードを文字列のarray[]として読み取ります。

string befunge93(string[] p) {
for (int i=0;i<p.Length;i++)
    p[i]=p[i].Replace("\"","ª"); // REMOVE QUOTATIONS TO MAKE THINGS EASIER
int l=0; int c=0; // current line and colum
var stack=new Stack<int>(new int[20000]); // initialize stack with many zeroes. 
string res=""; // output limited to 1000 chars
int limit=100000; // max commands limited to 10^5 
bool smode=false; // string mode
char direction='>';
//-------- MAIN LOOP ---------------
while (res.Length < 1000 && limit--> 0  )
    {
    var ch=p[l][c];
    if (ch=='ª') // ", TOGGLE STRING MODE
        smode = !smode;
    else if (smode) // STRING MODE => PUSH CHAR
        stack.Push((int)ch);
    else if (ch==',') // OUTPUT CHAR FROM STACK
        res+=(char)stack.Pop();
    else if (new Regex(@"[><^v]").IsMatch(""+ch)) // CHANGE DIRECTION
        direction = ch; 
    else if (new Regex(@"\d").IsMatch(""+ch)) // CHANGE DIRECTION
        stack.Push(ch-'0'); 
    else if (ch=='*') // MULTIPLICATION
        stack.Push(stack.Pop()*stack.Pop());
    else if (ch=='+') // SUM
        stack.Push(stack.Pop()+stack.Pop());
    else if (ch=='`') // GREATER THEN
         stack.Push(stack.Pop()>=stack.Pop()?0:1); 
    else if (ch=='!') // NOT
        stack.Push(stack.Pop()==0?1:0);
    else if (ch=='.') // OUTPUT NUMBER
        res+=$"{stack.Pop()} ";
    else if (ch=='#') // JUMP NEXT COMMAND
        move();
    else if (ch=='$') // DISCARD ITEM FROM STACK
        stack.Pop();
    else if (ch=='\\') // SWAP
        { var a=stack.Pop(); var b=stack.Pop(); stack.Push(a); stack.Push(b); }
    else if (ch=='%') // modulo
        { var a=stack.Pop(); var b=stack.Pop(); stack.Push(b%a); }
    else if (ch=='-') // MINUS
        { var a=stack.Pop(); var b=stack.Pop(); stack.Push(b-a); }
    else if (ch=='/') // DIVISION
        { var a=stack.Pop(); var b=stack.Pop(); stack.Push(b/a); }
    else if (ch==':') // DUPLICATE
        stack.Push(stack.First());
    else if (ch=='_' || ch=='|') // CONDITIONALS: MOVE IF STACK ZERO, LEFT OTHERWISE
        {
        var last = stack.Pop();
        if (ch=='_') direction=last==0?'>':'<'; // right if stack was zero. Left otherwise
        else direction=last==0?'v':'^'; // ch=='|'  
        }
    else if (ch==' '); // SPACE - DO NOTHING. 
    else return res;
    move();
    }
return res;
void move() // move cursor
{
    switch(direction)
        {
            case '>':
                if (++c==p[0].Length) c=0; break;
            case '<':
                if (--c==-1) c=p[0].Length-1; break;
            case 'v':
                if (++l==p.Length) l=0; break;
            case '^':
                if (--l==-1) l=p.Length-1; break;
            default: break;
        }
}
}
于 2020-08-19T18:21:10.060 に答える