Tam*_*ake 2 regex perl specifications
是否有perl正则表达式形式的规范将匹配所有perl正则表达式文字?
如果不这样,是否所有perl正则表达式文字都有任何语言的规范?
理想情况下,它应该包括正则表达式修饰符/x和正则表达式运算符s/,但我可以稍后解决这些问题.
变量插值后匹配的规格是理想的,但之前也很好.
上下文:我在perl(实际上,使用Parse :: RecDescent)编写一个编译成perl的元语言,并希望识别正则表达式文字并将它们传递给perl.
那些运算符可以包含任意Perl代码,并且没有规范.
例如,在
/$x{ EXPR }/
Run Code Online (Sandbox Code Playgroud)
和
s// EXPR /e
Run Code Online (Sandbox Code Playgroud)
EXPR 几乎可以是任何有效的Perl表达式.
但是,我认为你实际上不需要知道如何解析它.你只需要知道它的结束位置.这很容易.Perl还需要能够在解析运算符之前执行此操作,因此它不允许某些代码模式.(因此"几乎"在上面.)
任何出现的分隔符都必须以奇数" \" 开头.
作为例外,在上述中,当分隔符是(),[]或者{},分隔符可能会出现,只要它们是平衡的转义.
balanced_paren_guts : ( /(?:[^\\\(\)]|\\.)+/ | '(' balanced_paren_guts ')' )(s?)
balanced_square_guts : ( /(?:[^\\\[\]]|\\.)+/ | '[' balanced_square_guts ']' )(s?)
balanced_curly_guts : ( /(?:[^\\\{\}]|\\.)+/ | '{' balanced_curly_guts '}' )(s?)
match_op : <skip:> 'm' /\s*/ match_op_1 match_modifiers
match_op_1 : '(' <commit> balanced_paren ')'
| '[' <commit> balanced_square ']'
| '{' <commit> balanced_curly '}'
| /(?x: ([^\\]) (?:(?!\1).|\\.)* \1 )/
match_modifiers : /\w+/
subst_op : <skip:> 's' /\s*/ subst_op_1 subst_modifiers
subst_op_1 : '(' <commit> balanced_paren ')' \s* subst_op_2
| '[' <commit> balanced_square ']' \s* subst_op_2
| '{' <commit> balanced_curly '}' \s* subst_op_2
| /(?x: ([^\\]) (?:(?!\1).|\\.)* \1 (?:(?!\1).|\\.)* \1 )/
subst_op_2 : '(' <commit> balanced_paren ')'
| '[' <commit> balanced_square ']'
| '{' <commit> balanced_curly '}'
| /(?x: ([^\\]) (?:(?!\1).|\\.)* \1 )/
subst_modifiers : /\w+/
Run Code Online (Sandbox Code Playgroud)
笔记:
'»作为分隔符.\»作为分隔符,但我认为你不应该支持它.