首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是讽刺相当于Yacc的可选运算符("?")?

什么是讽刺相当于Yacc的可选运算符("?")?
EN

Stack Overflow用户
提问于 2014-05-27 09:47:25
回答 2查看 1.1K关注 0票数 1

我有一段Yacc符号的语法片段:

代码语言:javascript
运行
复制
stylesheet
: [ CHARSET_SYM STRING ';' ]?
  [S|CDO|CDC]* [ import [ CDO S* | CDC S* ]* ]*
  [ [ ruleset | media | page ] [ CDO S* | CDC S* ]* ]*
;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-27 09:56:22

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

来自讽刺维基百科的非终点站页面

在传统的BNF表示法中,"?“、"+”和"*“字符分别表示"0或1次”、"1次或多次“和"0次或多次”。讽刺的是,它的做法略有不同。对于"+“和"*”,可以使用基类中的MakePlusRule和MakeStarRule方法,也可以在规则中的术语上直接使用Q()、Plus()和Star()方法。

票数 2
EN

Stack Overflow用户

发布于 2014-12-19 18:26:13

作者说,现在需要额外的AST节点来实现这个目的。因此,例如,您可以在规则中用以下选项替换可选术语:

代码语言:javascript
运行
复制
new NonTerminal("OptionalTermName", Empty | TermThatShouldBeOptional)

http://irony.codeplex.com/discussions/550979

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

代码语言:javascript
运行
复制
(Empty | TermThatShouldBeOptional)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23886183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档