1

私は次のレモン文法を持っています(実際の文法から簡略化されています):

%right ASSIGN .
%nonassoc FN_CALL .

program ::= expression .
expression ::= expression ASSIGN expression .
expression ::= function_call . [FN_CALL]
expression ::= IDENTIFIER .


function_call ::= expression LPAREN RPAREN . [FN_CALL]

次の状態では、shift-reduceの競合を修正できません。

State 3:
      expression ::= expression * ASSIGN expression
  (1) expression ::= expression ASSIGN expression *
      function_call ::= expression * LPAREN RPAREN
                    ASSIGN shift  1
                    LPAREN shift  4
                    LPAREN reduce 1   ** Parsing conflict **
                 {default} reduce 1

問題はa=(b(c))と(a = b)(c)のあいまいさだと思いましたが、関数呼び出しに割り当てよりも優先順位を高くすると修正できると思いました。どんなアイデアがありますか?

4

2 に答える 2

0

最初の最大のポイント: shift-reduce の競合が実際の問題になることはめったにありません。そのため、これは修正する必要がない (または気にする必要がない) 可能性があります。

2 点目: 残念ながら、文法を単純化しすぎたようです。たとえば、(投稿した)文法は両方のように見え、完全に拒否する必要がa=(b(c))あり(a=b)(c)ます(LPARENを指定した唯一の場所で、すぐにRPARENが続く必要があります)。あなたが投稿した内容では、実際の文法のどこが間違っている可能性があるかを推測するのに十分ではありません.

于 2010-10-28T00:52:55.963 に答える
0

これはあなたが望むことをしますか?

program ::= assignment .

assignment ::= expression ASSIGN assignment .
assignment ::= expression .

expression ::= expression LPAREN RPAREN .
expression ::= IDENTIFIER .

関数呼び出しに割り当てることができますが (これは珍しいことです)、元の文法も同様です。これは、より大きな文法の一部に過ぎないことを理解しています。

于 2010-10-28T01:02:36.443 に答える