2016-03-24 5 views
1

私はこの文法を言語に対して持っていますが、文法には多少のあいまい性が含まれていますが、これを修正するのは非常に困難です。以下は、言語のBNF文法であり、私の幸せなパーサファイルのその部分の下にあります。あいまいな文法と可能な修正

提案言語の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"| "<"| "<=" | "==" | "!=" 

Parser.y

TProgram: program ID ':' TPars '.' { Program $2 $4 } 

TPars : TPar ';'     { [$1] } 
     | TPars TPar     { $2 : $1 } 

TPar : func ID TStructs   { Function $2 $3 } 
     --| "||" TPars     { Parall $2  } 
     | farm DIGIT TPars   { Farm $2 $3  } 

TStructs: TStruct ';'     { [$1] } 
     | TStructs TStruct   { $2 : $1 } 

TStruct : TExprs      { ExprList $1 } 
     --| '•' TStructs    { CompOp $2  } 
     | iter DIGIT TStructs   { Iter $2 $3 } 

TExprs : TExpr      { [$1] } 
     | TExprs ',' TExpr   { $3 : $1 } 

BinExpr : Term      { $1 } 
     | BinExpr Op BinExpr   { BinOp $2 $1 $3 } 

Op  : '/'       { Divide } 
     | '*'       { Times } 
     | '-'       { Minus } 
     | '+'       { Plus } 

Term : ID       { Var $1 } 
     | DIGIT      { Digit $1 } 
     | FLOAT      { Float $1 } 

TExpr : '(' TExprs ')'    { ParenExpr $2 } 
     | true      { Bool $1 } 
     | false      { Bool $1 } 
     | ID '=' TExprs    { Assign $1 $3 } 
     | raise ID '=' TExprs   { Raise $2 $4 } 
     | BinExpr      { $1 } 

編集:私は、あいまいさを引き起こしていると考えているものを示すBNF形式に矢印を追加しました文法の中で。

+0

これはパズルですか?なぜ私たちにあいまいさを見せないのですか?しかし、私は 'a = b、c'は'(a = b)、c'、 'a =(b、c)'と同様に解析できると信じています。 – Ingo

+0

@Ingoパズルではないので、今言及しています。 – ymg

答えて

3

だから、どのように

a = true, false 

が解析された取得したいのでしょうか?それは、私が%right%left%nonassocプラグマと「=」と「」結合性と優先順位を与えることによって、競合を解決することをお勧め、

(a=true), false 

または

a = (true, false) 

これはyaccのだった場合

可能性があり多分ハッピーはこのような何かをサポートします。

+0

あなたが言いたいことを見て、あなたが言及したポイント(ParsとStructsのシーケンスのようなものに焦点を当てていました)を考えたことはありません。そして、確かにHappyはあなたが言及したもののようなプラグマをサポートします。ご協力いただきありがとうございます。 – ymg

+0

@ymg私が見る限り、 'pars'と' structs'には同様の問題があります。基本的には物事のリストがありますが、別の物のリストで終わることもあります。外側のリストは終了する必要があります。 – Ingo

+0

おかげさまで、あなたは大きな助けになりました!私はちょうどあなたの発言の後にいくつかのことに気づいた。 – ymg

関連する問題