4

アセンブラー用のコードを作成しましたが、Pythonはまだ初めてです。
私のコードでは、アセンブリ言語に変換されるファイルをユーザーに入力させています。ほぼ動作していると思いますが、ユーザーがファイル名をどこに入力したのかわかりません。
私は(私が思うに)アイドル状態にあり、F5を押すとシェルで実行されます。エラーが発生しますが、ファイル名が入力されていないことが原因であると確信しています。

ユーザーはこれらの種類のものをどこに入力することになっていますか?これはPythonシェルから実行されますか、それともコマンドラインから実行されますか?実行可能ファイルに変換する必要がありますか?

誰かがユーザーがこのすべての情報を入力している場所を明確にするのを手伝ってもらえますか?

私の質問に答える必要はないと思いますが、コードのセグメントを入れますが、おそらくそれは私の問題のより良いアイデアをあなたに与えるでしょう。

if __name__ == '__main__':
import sys

if len(sys.argv) == 1:
    print 'need filename'
    sys.exit(-1)

table = SymbolTable()
parser = Parser(sys.argv[1])
parser.advance()
line = 0

while parser.hasMoreCommands():
    if parser.commandType() == 'L_COMMAND':
        table.addEntry(parser.symbol(), line)
    else:
        line += 1

    parser.advance()

code = Code()
parser = Parser(sys.argv[1])
parser.advance()

var_stack = 16

while parser.hasMoreCommands():
    cmd_type = parser.commandType()

    if cmd_type == 'A_COMMAND':
        number = 32768

        try:
            addr = int(parser.symbol())
        except:
            if table.contains(parser.symbol()):
                addr = table.getAddress(parser.symbol())
            else:
                table.addEntry(parser.symbol(), var_stack)
                addr = var_stack
                var_stack += 1

        bin_number =  bin(number | addr)[3:]
        assembly = '0' + bin_number
        print assembly
    elif cmd_type == 'C_COMMAND':
        assembly = '111'
        assembly += code.comp(parser.comp())
        assembly += code.dest(parser.dest())
        assembly += code.jump(parser.jump())
        print assembly

    parser.advance()

注意すべき部分は、ファイル名をチェックしている最初の4〜6行目です。したがって、プログラムを実行すると、「needfilename」が画面に出力され、次のようなエラーメッセージが表示されます。

Traceback (most recent call last):
 File "C:\Python27\Assembler.py", line 98, in <module>
  sys.exit(-1)
SystemExit: -1

では、このエラーを回避するためにファイル名をどこに入力できますか?

4

2 に答える 2

8

あなたがそれを持っているように、Pythonは引数としてファイル名を期待しています:

python file.py your_file.asm

ファイル名の入力を求める場合は、raw_input()(またはinput()Python 3の場合)次を使用します。

filename = raw_input('Enter a filename: ') or 'default_file.asm'
于 2013-02-23T06:31:42.133 に答える
1

sys.argvコマンドライン引数が含まれています。
したがって、十分なコマンドライン引数がない場合、ブレンダーが言ったように、入力を取得するには、このスクリプトをコマンドラインから実行する必要があります。ユーザーからの入力を取得するにはraw_input(または) を使用します。input

このようなもの:

if len(sys.argv) == 1:
    print "You can also give filename as a command line argument"
    filename = raw_input("Enter Filename: ")
else:
    filename = sys.argv[1]

そしてラインチェンジ

parser = Parser(sys.argv[1])

parser = Parser(filename)
于 2013-02-23T09:25:12.867 に答える