2017-09-22 38 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設計解析一個表達式(至少這就是文檔說:給這個實際上我有點驚訝你的第一個例子中的作品,不會拋出錯誤...)。

如果你想分析複式表達式,那麼你可以採取的事實優勢:

  1. parse可以告訴它從哪裏開始 從解析第二個參數start
  2. 如果你提供了這個start參數,那麼它將返回一個包含表達式的元組,以及表達式的完成位置。

自己定義一個parseall函數。過去有一個基地,但我不知道有什麼了。 編輯:還有在測試中看到下面

# 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

謝謝!這是鼓舞人心的! :)似乎在一行中有多個表達式有問題。我編輯你的迴應以在代碼中顯示它。但是沒想到它會需要同行評審......你可以在3:4 \ n print(i)\ nend \中檢查eval(parseall(「print(1); print(2)\ n \ (n))''和'eval(parseall(「print(1)\ nprint(2)\ n \ n我在3:4 \ n打印(i)\ nend \ n」))' – Liso

+1

@Liso您的例子的確如此錯誤,它與分析器在找到分號時生成':toplevel'表達式有關。用'ex.head ==:頂層?替換'push!(exs,ex)'?追加!(exs,ex.args):push!(exs,ex)'爲我解決了這個問題。 –

+0

Alexander_Morley和@Dan_Getz我喜歡接受固定版本。我們如何做到這一點? – Liso