我有一段Yacc符号的语法片段:
stylesheet
: [ CHARSET_SYM STRING ';' ]?
[S|CDO|CDC]* [ import [ CDO S* | CDC S* ]* ]*
[ [ ruleset | media | page ] [ CDO S* | CDC S* ]* ]*
;我如何以讽刺的方式实现这个片段?我找不到任何等价的?,这意味着在Yacc中出现0或1。
发布于 2014-05-27 09:56:22
您可以使用BnfTerm.Q方法来表示'?' (0或1次出现)。这是一个合理的设计决策,因为C#不允许您编写?操作符的自定义实现,这与+和*不同。
来自讽刺维基百科的非终点站页面:
在传统的BNF表示法中,"?“、"+”和"*“字符分别表示"0或1次”、"1次或多次“和"0次或多次”。讽刺的是,它的做法略有不同。对于"+“和"*”,可以使用基类中的MakePlusRule和MakeStarRule方法,也可以在规则中的术语上直接使用Q()、Plus()和Star()方法。
发布于 2014-12-19 18:26:13
作者说,现在需要额外的AST节点来实现这个目的。因此,例如,您可以在规则中用以下选项替换可选术语:
new NonTerminal("OptionalTermName", Empty | TermThatShouldBeOptional)http://irony.codeplex.com/discussions/550979
我想知道是否可以将其简化为:
(Empty | TermThatShouldBeOptional)重载创建了一个BNF项,而不是一个NonTerminal节点,在与其他BNF项直接连接时,该节点可能会丢失一些层次化信息,具体情况取决于实现。我还没有进一步调查。
https://stackoverflow.com/questions/23886183
复制相似问题