首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在BNFC语法中设置优先级级别

在BNFC语法中设置优先级级别
EN

Stack Overflow用户
提问于 2013-04-28 11:35:59
回答 2查看 287关注 0票数 1

背景:

我正在学习一个软件语义类,我们应该为一个名为 we 的玩具语言创建一个小型编译器和运行时。我们得到了Java的代码框架,但是我们可以使用任何我们想要的语言。我认为这是一个排练语法的机会,我认为在C++做实验室是很酷的。

现在,我在设置语句的优先级规则时遇到了一些问题。下面是我的BNFC语法文件:

代码语言:javascript
复制
SSkip.  Stmt    ::= "skip";
SAss.   Stmt    ::= VarName ":=" AExp;
SIf.    Stmt1   ::= "if" BExp "then" Stmt "else" Stmt;
SWhile. Stmt1   ::= "while" BExp "do" Stmt;
SComp.  Stmt    ::= Stmt ";" Stmt;
coercions Stmt 1;

token VarName   (letter (letter | digit) *);

EAdd.   AExp    ::= AExp "+" AExp1;
ESub.   AExp    ::= AExp "-" AExp1;
EMul.   AExp1   ::= AExp1 "*" AExp2;
EDiv.   AExp1   ::= AExp1 "/" AExp2;
EInt.   AExp2   ::= Integer;
EVar.   AExp2   ::= VarName;

coercions   AExp    2;

BTrue.  BExp1   ::= "true";
BFalse. BExp1   ::= "false";
BNeg.   BExp    ::= "not" BExp;
BConj.  BExp    ::= BExp "and" BExp;
BLeq.   BExp    ::= AExp "<=" AExp;

coercions BExp 1;

我想要的是输入

代码语言:javascript
复制
while true do skip; x:=y

按照我的复合规则被解析为

代码语言:javascript
复制
(SComp [SWhile [BTrue] [SSkip]] [(SAss "x" [EVar "y"])])

也就是说,我不希望分配成为循环体的一部分。然而,我得到的是

代码语言:javascript
复制
(SWhile [BTrue] [(SComp SSkip (SAss "x" [(EVar "y")]))])

如您所见,while-循环的主体由复合语句组成,这不是我想要的。我应该如何设置我的优先规则来达到这一效果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-28 13:25:10

结果我误解了我的任务,有点。我所描述的优先规则是在我的教程中提出的,但是由于我的主要关注是与老师给出的解析器兼容,我尝试了上面的代码,它也将作业解析到了正文中。

我想写的程序应该是“简单”的:

代码语言:javascript
复制
(while true do skip) ; x := y

但是嘿,至少它是兼容的!

票数 0
EN

Stack Overflow用户

发布于 2013-04-28 11:48:43

我认为问题在于,Scomp是Stmt的一种类型,无法从词汇上将它与简单的Stmt区分开来。

如果规则是

代码语言:javascript
复制
Scomp. Stmt ::= "{" Stmt ";" Stmt "}";

不会有任何含糊之处。在你所知道的任何一种普通语言中,复合语句都有开始和结束标记,这是有原因的。

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

https://stackoverflow.com/questions/16262431

复制
相关文章

相似问题

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