0

式を連結して文字列を形成できるように、連結された文字列を解析しようとしました。あれは、

"No, " + 4*(6+5)/(8-4) + " is not equal to " + 75*1.3 + "."

上記は正しく解析する必要があります。問題は、+シフト削減の競合につながることです。私は次の文法を使用しています。

<S> ::= <A> '+' <S>
      | <A>
<A> ::= <E>
       |QUOT
<E> ::= <T> '+' <E>
      | <T> '-' <E>
      | <T>
<T> ::= <F> '*' <T>
      | <F> '/' <T>
      | <F>
<F> ::= NUM
      | '(' <E> ')'

+shift-reduce 競合を引き起こさない文法を見つけようとしても成功していません。この文法を LALR にする方法があることを願っています。それを見つけるための助けをいただければ幸いです。

4

1 に答える 1

1

もしも:

  1. +どちらの演算子 (加算または連結)がどのように関連付けられるかは気にしません。と
  2. 文字列式を括弧で囲む必要はありません。

それなら解決策があります。上記の要件は非常に制限的であり、同じ演算子を 2 つの異なる優先順位で使用するべきではないと考えているため、実用的な解決策というよりは知的な演習と考えています。(実際、私は+連結に使用することを強く支持しているわけではありません。それは独自のシンボルに値するほど十分に異なっています。)

次の解決策は、文字列式が(. 連結の早すぎる縮小を避けるために、通常どおり、連結バージョンの連結バージョンを+右側に関連付け、追加バージョンは左側に関連付けます。

S : E '+' A
  | E
  | A
  ;

A : QUOT '+' S
  | QUOT
  ;

E : E '+' T
  | E '-' T
  | T
  ;

T : T '*' F
  | T '/' F
  | F
  ;

F : NUM
  | '(' E ')'
  ;
于 2013-08-01T21:39:22.473 に答える