gpt4 book ai didi

haskell - Shift减少快乐语法中的冲突

转载 作者:行者123 更新时间:2023-12-04 18:20:28 25 4
gpt4 key购买 nike

你好优秀的程序员,

我在快乐(haskell)中建立了以下语法:

P  :  program  C             {Prog $2}


E : int {Num $1}
| ident {Id $1}
| true {BoolConst True}
| false {BoolConst False}
| read {ReadInput}
| '(' E ')' {Parens $2}
| E '+' E { Add $1 $3 }
| E '-' E { Sub $1 $3 }
| E '*' E { Mult $1 $3 }
| E '/' E { Div $1 $3 }
| E '=' E { Eq $1 $3 }
| E '>' E { Gt $1 $3 }
| E '<' E { Lt $1 $3 }


C : '(' C ')' {$2}
| ident assign E {Assign $1 $3}
| if E then C else C {Cond $2 $4 $6}
| output E {OutputComm $2}
| while E do C {While $2 $4 }
| begin D ';' C end {Declare $2 $4}
| C ';' C {Seq $1 $3 }


D : D ';' D {DSeq $1 $3 }
| '(' D ')' {$2}
| var ident assign E {Var $2 $4}

现在,While 循环包含了“do”之后的所有命令。如何改变这种行为?我已经尝试过 %left, %right ... :(

最佳答案

发明两种C ,一个允许排序,一个不允许。像这样的东西,也许:

Cnoseq : '(' Cseq ')'
| ident assign E
| while E do Cnoseq

Cseq : Cnoseq ';' Cseq
| Cnoseq

关于haskell - Shift减少快乐语法中的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10790647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com