【发布时间】:2013-11-26 08:41:42
【问题描述】:
我正在用 Ruby 中的递归正则表达式解析伪 S 表达式。
经过一番搜索,我开始使用“Matching balanced parenthesis in Ruby using recursive regular expressions like perl”的答案中使用的正则表达式。正则表达式匹配正确,但结果表现出奇怪的行为。如果我尝试在任何结果上使用match,那么无论使用什么正则表达式,这些进一步的结果都将匹配整个测试字符串。如果我用字符串文字显式覆盖初始结果之一,则 match 会按预期工作。然而,结果条目的类无疑声称它是一个普通的香草字符串。这到底是怎么回事?
src = "(def foo 10) (+ foo 4 12)"
def parse(exp)
expression =%r{
(?<re>
\(
(?:
(?> [^()]+ )
|
\g<re>
)*
\)
)
}x
trans = ""
exp.scan(expression) {|m|
m[0].match(/\d/) {|m|
trans += m.string
}
}
return trans
end
当然,这甚至还不能完全解析代码。我也知道尝试使用正则表达式健壮地解析代码并不是一个好主意,但我并不是想做出一个健壮的解决方案,只是一个 POC。
有谁知道是什么导致这些正则表达式行为不端?
【问题讨论】:
-
这看起来是一个有趣的问题,但是您能否通过一个您看到的特定输出与您期望的输出示例来更新它?
-
你考虑过像TreeTop这样的解析表达式语法吗?
-
@PeterAlfvin 今天晚些时候我会更新这个问题并验证你的答案。
-
@MarkThomas 最终版本不会解析任何东西,它会搭载 LISP 宏。现在我只关注目标语言结构而不是源语言功能。