Parsing 歧义语法和可能的修复
所以我有一种语言的语法,语法肯定包含一些歧义,但是我发现修复这个语法有点异常困难。下面是该语言的BNF语法,下面是我的happy解析器文件的这一部分 拟议语言的BNF:Parsing 歧义语法和可能的修复,parsing,haskell,bison,yacc,happy,Parsing,Haskell,Bison,Yacc,Happy,所以我有一种语言的语法,语法肯定包含一些歧义,但是我发现修复这个语法有点异常困难。下面是该语言的BNF语法,下面是我的happy解析器文件的这一部分 拟议语言的BNF: <program> ::= Skel program "program" <id> ":" <pars> "." --> <pars> ::= <par> [";" &l
<program> ::= Skel program
"program" <id> ":" <pars> "."
--> <pars> ::=
<par> [";" <pars>] parallel statements
<par> ::=
"func" <id> <structs> structured expression
--> | <pars> "||" <pars> parallel pipeline
| "farm" <int> <pars> task farm
--> <structs> ::=
<struct> [";" <structs>] statements
<struct> ::=
<exprs> expression
--> | <structs> "•" <structs> composition
| "iter" <int> <structs> iteration
--> <exprs> ::=
<expr> ["," <exprs>] expressions
<expr> ::=
<int> integer value
| <string> string value
| <bool> boolean value
| <id> [ "=" <exprs> ] identifier/assignment
| "raise" <id> "=" <exprs> raise exception
| <exprs> "catch" <id> <id> ":" <exprs> catch exception
| <exprs> <op> <exprs> binary operator
| "(" <exprs> ")" grouping
<op> ::= operators
"+" | "*" | "-" | "div"| "<"| "<=" | "==" | "!="
编辑:我在BNF格式中添加了箭头,显示了我认为导致语法歧义的原因。那么,您希望如何
a = true, false
得到解析?可能是
(a=true), false
或
如果这是yacc,我建议通过赋予“=”和“,”与
%right
%left
和%nonassoc
pragmas的关联性和优先级来解决冲突,也许Happy支持类似的东西。这是一个难题吗?你为什么不给我们看看模棱两可的地方?然而,我相信a=b,c
可以被解析为(a=b),c
以及a=(b,c)
@Ingo这不是一个谜,我现在将标记我所指的。我明白你的意思,从来没有想到你提到的那一点(重点是Pars
和Structs
的序列)是的,就像你提到的那样,快乐支持布拉格语。谢谢你的帮助。@ymg据我所知,pars
和structs
也有类似的问题,基本上你有一个列表,但是一件事情可以以另一个列表结束,所以外部列表是否应该结束以及在哪里结束都不太清楚。谢谢,你帮了大忙!在你发言之后,我注意到了一些事情。
(a=true), false
a = (true, false)