2

改写...

我想知道如何最好地解析函数/条件。所以如果你有类似的东西:[if {a} is {12 or 34}][if {b} not {55}] show +c+ [/if][/if]这是条件中的条件。看起来我不能只用正则表达式来做到这一点。


原始问题

现在我有一个非常简单的方法来通过 actionscript 解析一些命令。

我正在使用正则表达式来查找标签、命令和操作数...

+key_word+  // any text surrounded by +
[ifempty +val_1+]+val_2+[/ifempty]  //simple conditional
[ifisnot={`true,yes`} +ShowTitle+]+val_3+[/ifisnot]  // conditional with operands

我当前的算法将开始标签[**]与第一个结束标签匹配,[/**]即使它不匹配。这意味着我不能做类似的事情[ifempty +val_2+][ifnotempty +val_2]+val_3+[/ifnotempty]+val_4+[/ifempty]- 基本上将一个条件放入另一个条件中。

我正在使用一种内联的解析方式,它根据这个正则表达式将字符串拆分为一个字符串数组\[[^\/](?:[^\]])*\](?:[^\]])*\[\/(?:[^\]])*\]

任何人都可以建议一个更强大的算法和更强大的解析约定/标准吗?特别是对于 as3。

4

1 回答 1

2

正则表达式定义正则语言。常规语言不能具有受限但可能无限的递归区域。

一种思考方式是所有正则语言都可以用有限状态机表示。对于每个可能的 if 数量,您都需要一个状态,但是机器必须是“有限的”,因此您处于绑定状态。一个经典的例子是:

a{n}b{n}, n >= 0
(meaning n a's, followed by n b's)

当您解析每个 a 时,您需要进入另一个状态(FSM 没有超出其所在状态的记忆,这是他们以后可以记住 n 以匹配它的唯一方法)。要解析任意数量的 n,您将需要无限数量的状态。

这与您所处的情况相同,正则表达式可以表达有限数量的 if(尽管需要大量复制粘贴),但不是无限数量。但是请注意,一些正则表达式实现有点作弊,赋予它们比数学等价物更多的功能。

无论如何,您最好的选择是使用更强大的解析方法。递归下降解析器的实现特别有趣,并且可以轻松完成您需要的工作。您还可以查看 LR 解析器,或使用堆栈构建简单的解析器。根据您的语言,您可能能够找到解析库,例如 Python 的 pyparse 或 C++ 的 Boost Spirit。

于 2010-11-15T21:53:50.590 回答