我想用 Ruby 中的 Parslet 编写一个解析器,它理解一种简单的配置语法:
alpha = one
beta = two\
three
gamma = four
从解析器的角度来看,反斜杠转义了新行,因此解析时的beta
值为twothree
。反斜杠虽然在配置文件中(即上面的文本是直接表示 - 它不是您放在 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 解析事物的方式有关。我的价值规则的第一部分是否在不关心后面部分的上下文的情况下获取尽可能多的字符?