我正在构建一种类似 SQL 的查询语言。我希望能够处理以逗号分隔的项目列表。我已经用这段代码成功地实现了这一点:
class QueryParser < Parslet::Parser
rule(:space) { match('\s').repeat(1) }
rule(:space?) { space.maybe }
rule(:delimiter) { space? >> str(',') >> space? }
rule(:select) { str('SELECT') >> space? }
rule(:select_value) { str('*') | match('[a-zA-Z]').repeat(1) }
rule(:select_arguments) do
space? >>
(select_value >> (delimiter >> select_value).repeat).maybe.as(:select) >>
space?
end
rule(:from) { str('FROM') >> space? }
rule(:from_arguments) { match('[a-zA-Z]').repeat(1).as(:from) >> space? }
rule(:query) { select >> select_arguments >> from >> from_arguments }
root(:query)
end
SELECT id,name,fork FROM forks
正确输出{:select=>"id,name,fork"@7, :from=>"forks"@25}
树的地方。
现在,我希望能够将SELECT
参数(id,name,fork
在本例中)转换为数组,而不是稍后再搞砸。我可以通过运行来做到这一点'id,name,fork'.split ','
。应用时,我无法让 Parslet 转换器为我执行此操作。这是我的查询转换器的代码:
class QueryTransformer < Parslet::Transform
rule(select: simple(:args)) { args.split(',') }
end
像这样应用时:
QueryTransformer.new.apply(
QueryParser.new.parse('SELECT id,name,fork FROM forks')
)
结果与我没有应用它时相同:{:select=>"id,name,fork"@7, :from=>"forks"@25}
.
我希望:select
成为的值是这样的数组["id","name","fork"]
。
我的问题是:如何:select
使用转换器将值拆分为数组?