What'与Yacc'的可选操作符("?")等价

本文关键字:quot 等价 操作符 Yacc What | 更新日期: 2023-09-27 18:05:24

我有一个Yacc语法片段:

stylesheet
: [ CHARSET_SYM STRING ';' ]?
  [S|CDO|CDC]* [ import [ CDO S* | CDC S* ]* ]*
  [ [ ruleset | media | page ] [ CDO S* | CDC S* ]* ]*
;

我如何在Irony中实现这个片段?我找不到任何等价的?,这意味着在Yacc中出现0或1。

What'与Yacc'的可选操作符("?")等价

您可以使用BnfTerm.Q方法来表示'?'(0或1次出现)。这是一个合理的设计决策,因为c#不允许您编写?操作符的自定义实现,不像+*

来自Irony维基百科的Non - Terminals页面:

在传统的BNF表示法中,使用"?"、"+"answers"*"字符表示"0或1次"、"1或多次"answers"0或多次",分别。在《讽刺》中,它的做法略有不同。你使用的makplusrule和MakeStarRule方法"+"answers"*",或者您可以使用Q()、Plus()和Star()方法

作者说现在需要一个额外的AST节点来实现这个目的。例如,您可以将以下内容替换为规则中的可选项:

new NonTerminal("OptionalTermName", Empty | TermThatShouldBeOptional)
http://irony.codeplex.com/discussions/550979

我想知道是否可以简化为:

(Empty | TermThatShouldBeOptional)

重载创建了一个BNF Term,而不是一个NonTerminal节点,后者在与其他BNF terms直接连接时可能会丢失一些层次信息,具体取决于实现。我还没有进一步调查。