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

标签 haskell grammar yacc happy

各位优秀的程序员,大家好,

我在 happy (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 - 转变减少快乐语法中的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10790647/

相关文章:

c - 如何将最终摘要消息放入 yacc 程序中?

c - flex bison C lex yacc 扫描字符串缓冲区

c++ - Bison 解析器无法识别 "New"关键字

haskell - 结合持久化和 IO

haskell - 函数组合中的类型检查

node.js - 回溯在 peg.js 中是如何工作的(有例子)?

regex - 为文本编辑器定义语法的最佳方法是什么?

grammar - 乔姆斯基语言类型

haskell - Haskell 中 "!!"的含义

haskell - 是否有类型为 : (Floating a, RealFrac b) => a -> b 的标准 Haskell 函数?