2012-02-06 73 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 

這是一種改變,如果和其他人之間的優先衝突。

希望它有幫助。