【发布时间】:2018-10-04 07:10:32
【问题描述】:
我想用 Ruby 中的 Parslet 编写一个解析器,它可以理解一些简单的配置语法:
alpha = one
beta = two\
three
gamma = four
从解析器的角度来看,反斜杠转义了新行,所以解析时beta的值为twothree。但是,配置文件中的反斜杠 is (即上面的文本是直接表示 - 它不是您放在 Ruby 字符串引号内的内容)。在 Ruby 中,它可以表示为"alpha = one\nbeta = two\\\nthree\ngamma = four"。
我目前的尝试对于单行设置很好,但无法处理多行方法:
require "parslet"
class SettingParser < Parslet::Parser
rule(:term) { match("[a-zA-Z0-9_]").repeat(1) }
rule(:value) do
(match("[^\n]").repeat(1) >> match("[^\\\n]") >> str("\\\n")).repeat(0) >>
match("[^\n]").repeat(0)
end
rule(:space) { match("\\s").repeat(1) }
rule(:setting) do
term.as(:key) >> space.maybe >> str("=") >> space.maybe >>
value.as(:value)
end
rule(:input) { setting.repeat >> space.maybe }
root(:input)
end
我想知道这个问题是否与 Parslet 解析事物的方式有关。我的价值规则的第一部分是否尽可能多地抓取字符而不关心后面部分的上下文?
【问题讨论】: