PegJS - 匹配所有字符,包括 ) 除非 ) 是最后一个字符
PegJS - match all characters including ) except if ) is the last character
我正在编写 PegJS 语法来解析 SQL 语句。我正在努力将函数拆分为 function_id(function_args)
。对于函数参数,我想匹配所有字符,包括 (
和 )
除了最后一个 )
,这是嵌套函数所必需的。
如何编写规则来匹配包含 )
的所有字符,除非 )
是字符串中的最后一个字符。
语法如下
Function
= func_name open_p args close_p
func_name
= name:[A-Z]+ {return name.join('');}
open_p
= "("
close_p
= ")"
args
= ar:(.*[^)]) {return ar.join('');}
测试字符串是
AVG(A + AVG(B + C))
正确处理参数的规则会有所帮助。此外,您可以在规则中使用 $()
符号来组合已解析的字符串,而不是使用 {return name.join('');}
。
args
可以重复 function
或 nonfunction
。 nonfunction
通过向前看捕获所有不是函数的东西。
function
= func_name open_p (args+ / "") close_p
func_name
= $([A-Z]+)
open_p
= "("
close_p
= ")"
args
= function / nonfunction
nonfunction
= $((!(function / close_p) .)+)
我正在编写 PegJS 语法来解析 SQL 语句。我正在努力将函数拆分为 function_id(function_args)
。对于函数参数,我想匹配所有字符,包括 (
和 )
除了最后一个 )
,这是嵌套函数所必需的。
如何编写规则来匹配包含 )
的所有字符,除非 )
是字符串中的最后一个字符。
语法如下
Function
= func_name open_p args close_p
func_name
= name:[A-Z]+ {return name.join('');}
open_p
= "("
close_p
= ")"
args
= ar:(.*[^)]) {return ar.join('');}
测试字符串是
AVG(A + AVG(B + C))
正确处理参数的规则会有所帮助。此外,您可以在规则中使用 $()
符号来组合已解析的字符串,而不是使用 {return name.join('');}
。
args
可以重复 function
或 nonfunction
。 nonfunction
通过向前看捕获所有不是函数的东西。
function
= func_name open_p (args+ / "") close_p
func_name
= $([A-Z]+)
open_p
= "("
close_p
= ")"
args
= function / nonfunction
nonfunction
= $((!(function / close_p) .)+)