1

所以 Doctrine 注释是基于 JSON 的,但是由于 PHP 数组允许悬挂逗号 Drupal 人们已经习惯了这一点,老实说,它更容易编辑

(
  "foo" => "bar",
  "foo1" => "bar1",
)

这样可以切换行,添加另一行等,而不是缺少 bar1 之后的逗号。

所以我正在尝试修补Doctrine 以允许这样做。维护者声称

您通过检查不属于“值”但其父级“注释”的标记来混合语法规则。

他是对的。所以,我们正在寻找更好的语法。

Annotation     ::= "@" AnnotationName ["(" [Values] ")"]
Values ::= Array | Value {"," Value}*

您如何允许在 Values 中使用尾随逗号?

4

2 回答 2

4

修改后的语法LL(1)不再存在。因此,Doctrine 实现的简单递归下降解析器需要回溯。

在这种情况下,您需要确保::Value()可以回溯,即。触发异常并将解析重置为进入之前的位置::Value()。您捕获此异常并在::Values()您已经拥有一个有效值后立即忽略它。

这需要能够在词法分析器中搜索,我不知道它有多实用。AbstractLexer有点奇怪。


编辑:最简单的方法是将语法保持为 LL(1) 形式。一种方法是将括号移到内部Values

Values ::= "(" [Array | Value {"," Value}* [","] ] ")"
于 2013-09-14T13:27:22.190 回答
2

要在末尾添加可选逗号,我们可以使用 [] 表示法:

Annotation     ::= "@" AnnotationName ["(" [Values] ")"]
Values ::= Array | Value {"," Value}* [","]
于 2013-09-14T09:42:17.260 回答