2017-12-11 11 views
0

私は楽しみのための超基本的なプログラミング言語を作るプロジェクトに取り組んでいます。私はprintコマンドを扱っています.2種類のオプション、ダイレクトプリント、スタックからの印刷があります。プログラムはすでにスタックに項目を持っていますが、スタックから印刷するコマンドを実行するたびに、その項目をスキップします。ここに私のコードです:C#の文字列の比較の問題

if (String.Equals(cmds[pos], "print")) 
{ 
    if (cmds[pos + 1].StartsWith("\"")) 
    { 
     Console.Write(cmds[pos + 1].Replace("\"", "").Replace(@"\q", "\"").Replace(@"\n", "\n")); 
     outPos = pos + 2; 
    } 
    else if (string.Equals(cmds[pos + 1], "stack")) 
    { 
     Console.WriteLine(strStack.Pop()); 
     outPos = pos + 2; 
    } 
    else 
    { 
     //Console.WriteLine("HelloKreeKraw"); 
     outPos = pos + 1; 
    } 
} 

、ここでは、コマンドは次のとおりです。

push "Hi\n" 
throw stack 
push "Hello" 
print stack 
print "World!\n" 
end 

pushコマンドは、スタックにプッシュして、エンドコマンドがプログラムを終了します。プログラムは理由なくプリントスタックをスキップします。私は何かが欠けていない限り、それができるすべてをテストしましたか?

編集: string.replaceとcmds [pos + 1] .StartsWith( "\" ")はうまく動作しますが、スタックされている2番目の単語があるかどうかを確認するとランダムにグリッチします。

+2

はい、ネストされていない場合はネストされていません。 – Arjang

+0

ブレークポイントを使用して、いくつかの予備的なものを最初にチェックすることはできますか? (配列は0に基づいているので) 'pos'は正しいです。' cmds'配列はスペースなどで正しく分割されます。 –

+0

この行は、Replace()が正しく動作していることを確認します。Console.Write(cmds [pos + 1] .Replace (@ "\ n"、 "\ n")); – MethodMan

答えて

0

あなたが学びたいのであれば、LexとYACC/Bisonの本を手に入れる必要があります。基本的なコンパイラ理論はここでは使用されていません。あなたはあなたのトークンを識別するためのレクサーを作成します。コード/オプションを発行するトークンの解析は、より良い方法です。

ちなみに、C#を使用している場合、 yで最初に式ツリーを構築するコードを実行し、最後に実行するだけです。実際のコンパイラを構築するのにもっと近い:)。

最も簡単な方法は、実行しようとしていることを実行するために、ネストされたifs ...ではなく、実装に再帰的なdescentを使用することです。私たちはあなたの文字列処理を修正するためにあなたと一緒に働くことができましたが、これはあなたを助けるいくつかの優れたツールで解決された問題です。