0

我正在为 Lua 编写一个 jFlex 词法分析器,并且在设计正则表达式以匹配语言规范的一个特定部分时遇到问题:

文字字符串也可以使用长括号括起来的长格式来定义。我们将第 n 级的左长括号定义为一个左方括号,后跟 n 个等号,然后是另一个左方括号。因此,级别 0 的左长括号写为 [[,级别 1 的左长括号写为 [=[,依此类推。闭合长括号的定义类似;例如,第 4 级的右长括号写为]====]。长字符串以任何级别的左长括号开始,并在同一级别的第一个右长括号结束。这种括号形式的文字可以运行多行,不解释任何转义序列,并忽略任何其他级别的长括号。它们可以包含除适当级别的右括号之外的任何内容。

简而言之,我正在尝试设计一个正则表达式,它将匹配一个开始的长括号、中间的字符串内容和结束的长括号。只有当开始长括号和结束长括号具有相同数量的等号(可以是零或更多)时,才会发生匹配。

4

3 回答 3

6

好吧,恐怕用正则表达式进行标记对这项任务来说还不够好。正则表达式还不够强大。

没有办法在 jFlex 中使用普通的正则表达式来比较 '=' 标记的数量。Perl 会为此提供一个技巧(如上面建议的 \1 ),但我们不是在谈论编程 Perl,而是在谈论 jFlex 词法分析器。

解决方案是使用 \[=*\[ 作为左括号标记,使用 \]=*\] 作为右括号标记,然后在上面的层(解析器)中比较它们的长度是否匹配。

无论如何,您可以查看 llex.c 中的 lua 源代码中的 read_long_string() ,看看他们是如何在完全不使用正则表达式的情况下做到这一点的。

于 2009-06-22T05:27:10.647 回答
4
\[(=*)\[.*?\]\1\]

\1 捕获第一个 ()。

于 2009-06-21T12:07:34.403 回答
3
\[(=*)\[.*?\]\1\]
于 2009-06-21T12:07:59.723 回答