2016-09-17 21 views
1

I以下のモジュールを有する:アレイタイプが定義されていない

module lexer 

export parseCode 

function parseCode(s::String) 
lexeme::Array{UInt32, 1} 
words = Dict("dup"=>UInt32(0x40000001), "drop"=>UInt32(0x40000002),  "swap"=> UInt32(0x40000003), "+"=> UInt32(0x40000004), "-"=> UInt32(0x40000005), "x"=> UInt(0x4000000c),"/"=>UInt32(0x40000006), "%"=> UInt32(0x40000007), "if"=> UInt32(0x40000008), 
    "j"=> UInt32(0x40000009), "print"=> UInt32(0x4000000a), "exit"=>UInt32(b)) 

    opcode = split(s) 
    for w in opcode 
    instruction::UInt32 
    instruction = get(words,w,0) 
    if instruction != 0 
     push!(lexeme,instruction) 
    end 
    end 
    push!(lexeme,UInt32(11)) 
    return lexeme 
end 
end 

機能parseCodeは、文字列s内の単語を解析し、各単語に対して対応する整数値を取得し、にそれらをプッシュします配列の語彙素。 関数はtest.jlする配列を返します。

require("stackProcessor") 
require("lexer") 

using stackProcessor 
using lexer 

#=prog=Array{UInt32,4} 
prog=[3,4,0x40000001, 5, 0x40000002, 3,0x40000003, 2, 0x40000004, 0x40000000] 

processor(prog) 
=# 
f = open("opcode.txt") 
s = readall(f) 
close(f) 
print(s) 

opcode = parseCode(s) 
print(repr(opcode)) 
processor(opcode) 

オペコードは、語彙素の配列のコピーを取得する必要がある変数ですが、私は次のエラーを取得する:

oadError: UndefVarError: lexeme not defined 
in parseCode at C:\Users\Administrator\AppData\Local\atom\app-1.10.2\julia\lexer.jl:11 
in include_string at loading.jl:282 
in include_string at C:\Users\Administrator\.julia\v0.4\CodeTools\src\eval.jl:32 
in anonymous at C:\Users\Administrator\.julia\v0.4\Atom\src\eval.jl:84 
in withpath at C:\Users\Administrator\.julia\v0.4\Requires\src\require.jl:37 
in withpath at C:\Users\Administrator\.julia\v0.4\Atom\src\eval.jl:53 
[inlined code] from C:\Users\Administrator\.julia\v0.4\Atom\src\eval.jl:83 
in anonymous at task.jl:58 
while loading C:\Users\Administrator\AppData\Local\atom\app-1.10.2\julia\test.jl, in expression starting on line 17 

おかしい事はありますそれは正常に動作していた今、私にこのエラーを与えている。 私はJuliaで配列がコピーとして返されると思ったので、エラーがどこから来ているのかわかりません。あなたはローカル変数を初期化することを望んでいたよう

+0

おそらく '語彙素を'は、最初は地球環境から放置されていたため、これは以前に働いていました。グローバルに再定義するか、関数 'parseCode'を変更する必要があります。 –

+0

@ダン:次に、関数の引数として空の配列を渡し、次に新しい内容で配列を埋める必要がありますか? – JJTO

答えて

3

ライン

lexeme::Array{UInt32, 1} 

が聞こえる...しかし、それはそれが何をするかではありません。これは、の既存の変数のタイプアサーションです。私はそれがエラーを生成している行11であると仮定しています、そうですか?

11行目の語彙変数の種類をアサートしようとした時点で、特定の変数がその関数のその時点までまだ定義されていないことを示すエラーが表示されます。

ワークスペースをクリアする前に、それはグローバル変数か何かのように存在していたので、おそらくそれは働いていた...

あなたは初期化したい場合は、代わりにこのような何か:

lexeme = Array{UInt32,1}(0); 
+0

私は(0)を見落としました。私は台無しになった...ありがとう。 – JJTO

+1

簡単な構文は 'UInt32 []'です。 –

関連する問題