2017-09-22 10 views
4

もっと多くのコード行を解析するにはどうすればよいですか?Juliaで複数行文字列を解析するには?

これが機能している:

julia> eval(parse("""print("O");print("K")""")) 
OK 

これが動作していません。

julia> eval(parse("""print("N"); 
print("O")""")) 
ERROR: ParseError("extra token after end of expression") 
Stacktrace: 
[1] #parse#235(::Bool, ::Function, ::String) at ./parse.jl:237 
[2] parse(::String) at ./parse.jl:232 

ところで、私は行ずつをしようとした場合、私は他の問題を抱えています。たとえば:ものの

julia> parse("""for i in 1:3""") 
:($(Expr(:incomplete, "incomplete: premature end of input"))) 

julia> eval(parse("""for i in 1:2 
println(i) 
end""")) 
1 
2 

答えて

2

parseは、少なくとも、それはドキュメントが言うことだ(単一の式を解析するために設計されています。この与えられた私は実際にビットがあなたの最初の例では、作品驚いて、エラーをスローせずに...)。

あなたはmutliple式を解析したいなら、あなたはという事実を利用することができます。

  1. parseが から解析を開始するためにそれを伝える二番目の引数startを取ることができます。
  2. この開始引数を指定すると、式を含むタプルと式が終了した場所のタプルが返されます。

parseallを自分で定義してください。以前はベースに1つあったが、もうそこにいるのか分からない。 編集:テストでは依然として存在しているが

# modified from the julia source ./test/parse.jl 
function parseall(str) 
    pos = start(str) 
    exs = [] 
    while !done(str, pos) 
     ex, pos = parse(str, pos) # returns next starting point as well as expr 
     ex.head == :toplevel ? append!(exs, ex.args) : push!(exs, ex) #see comments for info 
    end 
    if length(exs) == 0 
     throw(ParseError("end of input")) 
    elseif length(exs) == 1 
     return exs[1] 
    else 
     return Expr(:block, exs...) # convert the array of expressions 
            # back to a single expression 
    end 
end 
+1

感謝の下に参照してください!感動しています! :) 1行に複数の式がある問題があるようです。あなたの応答を編集してコードで表示します。しかし、それはピアレビューを必要とするとは思っていません...あなたは 'eval(parseall(" print(1); print(2)\ n \ nを3:4 \ n print(i)\ nend \ (i)\ nend \ n ")))') – Liso

+1

@Lisoあなたの例は確かにです。それはパーサがセミコロンを見つけたときに ':toplevel'式を生成することと関係があります。 'push!(exs、ex)'を 'ex.head ==:toplevel 'に置き換えますか?追加!(exs、ex.args):push!(exs、ex) '私の問題を修正しました。 –

+0

Alexander_Morleyと@Dan_Getz私は固定バージョンを受け入れるのが好きです。私たちはそれをどうやってできるのですか? – Liso

関連する問題