首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >prod = (expr | expr')*形式的生产规则上的sablecc出现问题

prod = (expr | expr')*形式的生产规则上的sablecc出现问题
EN

Stack Overflow用户
提问于 2011-03-28 09:23:20
回答 2查看 547关注 0票数 1
代码语言:javascript
复制
Productions
    program = cls*;
    cls = clsdef name openbrace clsdata closingbrace;
    clsdata = (clsfield|clsmethod)*;
    clsfield = [variabletype]:name [variablename]:name semi;
    clsmethod = [returntype]:name [methodname]:name openmethodbrace closingmethodbrace openbrace closingbrace;

问题出在

代码语言:javascript
复制
clsdata = (clsfield|clsmethod)*;

如果我将clsdata设置为

代码语言:javascript
复制
clsdata = clsfield*;

或转到

代码语言:javascript
复制
clsdata = clsmethod*;

但是,正如您可以想象的那样,它工作得很好,它的含义与我想要的并不相同。我想要一个同时支持方法和字段的类(没有特定的顺序!)

所以我的问题是,我应该如何定义clsdata,这样我就不会出错。我可以想到递归的替代方案,但我希望尽可能保持干净!

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-28 20:55:47

clsdata = (clsfield|clsmethod)*;

SableCC具有类似EBNF的语法,但不支持这种类型的语法规则。正如您已经做过的,非终端替代方法clsfieldclsmethod需要重新映射到它们自己的生产环境中。

但我不确定这是不是最好的方法

如果你查看任何一个SableeCC example grammars,你会发现这是定义“类成员”的标准方式。尽管您也许可以通过删除clsmembers来简化语法

代码语言:javascript
复制
Productions
    program = cls*;
    cls = clsdef name openbrace clsmember* closingbrace;
    clsmember = {clsfield} clsfield | {clsmethod} clsmethod;
    clsfield = [variabletype]:name [variablename]:name semi;
    clsmethod = [returntype]:name [methodname]:name openmethodbrace closingmethodbrace openbrace closingbrace
票数 1
EN

Stack Overflow用户

发布于 2011-03-28 09:51:40

这是可行的:

代码语言:javascript
复制
Productions
    program = cls*;
    cls = clsdef name openbrace clsmembers closingbrace;
    clsmembers = clsmember*;
    clsmember = {clsfield} clsfield | {clsmethod} clsmethod;
    clsfield = [variabletype]:name [variablename]:name semi;
    clsmethod = [returntype]:name [methodname]:name openmethodbrace closingmethodbrace openbrace closingbrace;

然而,我不确定这是不是最好的方法。我欢迎其他方法!

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

https://stackoverflow.com/questions/5453780

复制
相关文章

相似问题

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