多级解析算法

时间:2010-10-01 21:39:02

标签: actionscript-3 parsing parser-generator

改写...

我想知道如何最好地解析函数/条件。所以如果你有类似的东西:[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。

1 个答案:

答案 0 :(得分:2)

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

一种思考方式是所有常规语言都可以由有限状态机表示。对于每个可能的if数,你需要一个状态,但是机器必须是'有限的',所以你的绑定。一个典型的例子是:

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

当您解析每个a时,您需要转到另一个状态(FSM没有超出其状态的内存,这是他们记住n以后再匹配它的唯一方法)。要解析任意数量的n,你需要无数个状态。

这与你所处的情况相同,正则表达式可以表示有限数量的ifs(虽然它需要相当多的复制粘贴),但不是无限数。但请注意,一些正则表达式实现会有所作为,使它们比它们的数学等价物具有更大的功率。

无论如何,最好的办法是使用更强大的解析方法。 recursive descent parser实施起来特别有趣,可以轻松完成您的需要。您还可以查看LR解析器,或使用堆栈构建简单的解析器。根据您的语言,您可能能够找到解析库,例如Python的pyparse或C ++的Boost Spirit。