Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 歧义语法和可能的修复_Parsing_Haskell_Bison_Yacc_Happy - Fatal编程技术网

Parsing 歧义语法和可能的修复

Parsing 歧义语法和可能的修复,parsing,haskell,bison,yacc,happy,Parsing,Haskell,Bison,Yacc,Happy,所以我有一种语言的语法,语法肯定包含一些歧义,但是我发现修复这个语法有点异常困难。下面是该语言的BNF语法,下面是我的happy解析器文件的这一部分 拟议语言的BNF: <program> ::= Skel program "program" <id> ":" <pars> "." --> <pars> ::= <par> [";" &l

所以我有一种语言的语法,语法肯定包含一些歧义,但是我发现修复这个语法有点异常困难。下面是该语言的BNF语法,下面是我的happy解析器文件的这一部分

拟议语言的BNF:

<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)