首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建shift-reduce / reduce-reduce空闲语法

创建shift-reduce / reduce-reduce空闲语法
EN

Stack Overflow用户
提问于 2011-04-12 07:17:44
回答 1查看 286关注 0票数 0

我正在尝试用sablecc实现一个简单的类似Java的语言解析器,尽管我在实现ifwhileblock语句时经常遇到shift-reduce / reduce-reduce问题。

例如,我考虑了以下几点:

stmts = stmt*

stmt = if_stmt | block_stmt | while_stmt

block_stmt = { stmts } | ;

while_stmt = while ( predicate ) { stmts } | while ( D24 ) ;

例如,这种语法会导致这样的问题:当你有某种形式的东西

代码语言:javascript
复制
while (true) ;

解析器将无法知道是只减少; (来自block_stmt)还是完整的while (true); (来自while_stmt)。

我一直在到处阅读shift-reduce / reduce-reduce问题的原因,我想我理解它们。但一件事是知道是什么导致了它们,而另一件完全不同的事情是知道如何组织语法,以便我避免它们。我尝试过以非常不同的方式实现语法,但最终还是遇到了问题。

我猜,与其只是试图从特定的ss / rr问题中逃脱,还不如有一种范式来遵循这样的范式来避免这种问题?我相信我处理这个问题的方式一定是完全错误的:

有没有关于如何从头开始构建语法而不陷入所有这些陷阱的资源?关于这个问题的资源往往要么非常简单(说明明显的if then else问题),要么是完全标记的语法,这是一种难以理解的语法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-12 07:30:53

问题是你的语法被指定了,比如分号可以解释为while_stmt的分号或者block_stmt的分号……不,对不起,不是那样,但不知何故语法是多余的,因为{ stmt }在RHS上出现了两次。通常你会这样做

代码语言:javascript
复制
 stmts ::= stmt | stmts stmt
 block_stmt ::= { stmts }
 stmt ::= ... | block_stmt | ;     // empty
 while_stmt ::= while ... stmt
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5628682

复制
相关文章

相似问题

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