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。
您可以使用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直接连接时可能会丢失一些层次信息,具体取决于实现。我还没有进一步调查。