2012-02-06 88 views
2

我一直在使用lex和yacc编写一个命令式语言的编译器,今天我完成了语法,事情是,我一直在网上阅读每个语法都期望有几个转换/减少冲突,特别是如果它有if/else语句,这通常被称为dangling if-else,而我的确有if/elsif/else语句,但它在编译时不会引发任何冲突,问题是如果elsif else语句解析

¿这是否意味着这种语法有缺陷,仅仅是因为它不会引发任何转换/减少冲突?我没有太多的经验这样做,但我不能找到

如果你想要更多的信息为,如果在这个语法/ ELSIF/else语句是像这样的作品有任何问题:

statement -> ... 
------------| initial_conditional_stmt 

initial_conditional_stmt: conditional_stmt 
-----------------------| conditional_stmt 'else' block 


conditional_stmt -> 'if' '(' expression ')' block 
------------------| conditional_stmt elsif '(' expression ')' block 

块只是括号内的语句列表{}

+0

看看这个IF-ELSE解析器使用Flex和Bison http://c-madeeasy.blogspot.in/2012/05/if-else-statement-is-commonly-used-in.html – techno 2012-05-14 04:20:22

回答

3

没有移位/减少冲突意味着您在语言设计方面做得非常好,而且从不含糊。

干得好,给自己拍一下背部,放松一下,从冰箱里抢啤酒。

+0

这的确很好阅读,现在我可以和平开始在AST上工作,谢谢! – Alb3rt 2012-02-06 18:33:59

+0

这是一个非常不完整的答案。 Dervall的回答包含了更有用的推理,说明为什么没有冲突。 – Lii 2013-05-03 13:31:27

2

你没有得到悬挂其他的原因是因为你使用的是块而不是普通的语句。

为了您的语法,你不能做

if (cond) 
    if (cond) { 
     [stuff] 
    } 
    else 
    { 
    }  

你将不得不这样做

if (cond) 
{ 
    if (cond) { 
     [stuff] 
    } 
    else 
    { 
    } 
} 

每一个嵌套的if语句必须是内部匹配{}。这在你的情况下消除了悬挂其他在一个有点陌生的语法的代价。与“正常”语法相比,“块”可能是“陈述”,这也可能是另一种陈述,从而导致经典转换/减少冲突。

+0

从一开始我就被教导说写第一个例子中的条件语句是一个不好的习惯,所以我真的没有想到在这种特殊情况下,但我认为这是一件好事,迫使程序员把所有'东西'在块内,谢谢你的解释! – Alb3rt 2012-02-06 19:05:26

+0

你是不是指“陌生人”?在我看来,Alb3rt的语法更强大,但是我来自Ada背景,{}的语法等同于语法必要;而且如果用C语言或类似语言编写,我总是会把{}写入。 – 2012-02-25 21:19:12

+0

我的意思是,在一个卷发护腕开发者的正常情况下,他会希望能够省略一个衬衫的护腕。两种语法都没有错。 – Dervall 2012-02-25 21:25:57

0

您可以更好地使用这些代码如下:

%nonassoc XIF 
%nonassoc ELSE 

    stmt: IF expr stmt %prec XIF 
     | IF expr stmt ELSE stmt 

这是一种改变,如果和其他人之间的优先冲突。

希望它有帮助。