【发布时间】:2016-07-06 07:45:57
【问题描述】:
我尝试在 Antlr4 中创建一个语法,它接受 由任意字符分隔的正则表达式(类似于 Perl)。我怎样才能做到这一点?
要明确:我的问题不是正则表达式本身(我实际上不在 Antlr 中处理,而是在访问者中处理),而是分隔符。我可以轻松地为词法分析器定义以下规则:
REGEXP: '/' (ESC_SEQ | ~('\\' | '/'))+ '/' ;
fragment ESC_SEQ: '\\' . ;
这将使用正斜杠作为分隔符(就像在 Perl 中常用的那样)。不过,我也希望能够将正则表达式写成m~regexp~(在 Perl 中也可以)。
如果我必须使用正则表达式本身来解决这个问题,我会使用这样的反向引用:
m(.)(.+?)\1
(这是一个“m”,后接任意字符,后接表达式,后接相同的任意字符)。但是在 Antlr4 中似乎没有反向引用。
如果我可以使用成对的括号会更好,即m(regexp) 或m{regexp}。但由于可能的括号类型的数量非常少,这可以通过简单地枚举所有不同的变体来解决。
这可以用 Antlr4 解决吗?
【问题讨论】: