我使用Parslet解析一些自定義的數據開始。在這些例子中,所產生的解析數據是一樣的東西:如何使用Parslet用繩子不Parslet片
{ :custom_string => "data"@6 }
而且我創建的轉換像
rule(:custom_string => simple(:x)) { x.to_s }
但它不匹配,大概是因爲我傳遞「數據「@ 6而不僅僅是」數據「,這不僅僅是一個簡單的字符串。所有examples的變換有哈希值與字符串,而不是與Parslet ::片是什麼解析器輸出。也許我錯過了一個步驟,但我無法看到文檔中的任何內容。
編輯:更多的示例代碼(縮版但仍應該說明)
original_text = 'MSGSTART/DATA1/DATA2/0503/MAR'
require "parslet"
include Parslet
module ParseExample
class Parser < Parslet::Parser
rule(:fs) { str("/") }
rule(:newline) { str("\n") | str("\r\n") }
rule(:msgstart) { str("MSGSTART") }
rule(:data1) { match("\\w").repeat(1).as(:data1) }
rule(:data2) { match("\\w").repeat(1).as(:data2) }
rule(:serial_number) { match("\\w").repeat(1).as(:serial_number) }
rule(:month) { match("\\w").repeat(1).as(:month) }
rule(:first_line) { msgstart >> fs >> data1 >> fs >> data2 >> fs >> serial_number >> fs >> month >> newline }
rule(:document) { first_line >> newline.maybe }
root(:document)
end
end
module ParseExample
class Transformer < Parslet::Transform
rule(:data1 => simple(:x)) { x.to_s }
rule(:data2 => simple(:x)) { x.to_s }
rule(:serial_number => simple(:x)) { x.to_s }
rule(:month => simple(:x)) { x.to_s }
end
end
# Run by calling...
p = ParseExample::Parser.new
parse_result = p.parse(original_text)
# => {:data1=>"data1"@6, :data2=>"data2"@12, :serial_number=>"0503"@18, :month=>"MAR"@23}
t = ParseExample::Transformer.new
transformed = t.apply(parser_result)
# Actual result => {:data1=>"data1"@6, :data2=>"data2"@12, :serial_number=>"0503"@18, :month=>"MAR"@23}
# Expected result => {:data1=>"data1", :data2=>"data2", :serial_number=>"0503", :month=>"MAR"}
變形金剛既散列和對象樹工作從解析器返回。所以別的東西一定是錯的。請張貼更多的代碼,以便我們發現問題。 –