0

次のパターンを認識する yacc グラマーを作成しようとしています。

AAAA  -> Multiple As
BBBB  -> Multiple Bs
AAAABB -> 2 As followed by (AABB)
AAABBBBB  -> (AAABBB) followed by 2Bs

一般に、連続した As と B の等しいブロックを一緒にグループ化し、As または B だけの実行よりも優先します。単純な文法は、多くの競合を示しています。

この生産を優先する方法が必要です。

T -> | AB | ATB

以上

U -> | AU

(ここで、T と U は yacc プロダクション、A と B はトークン)

これはどのように行われますか?

4

1 に答える 1

2

一般に、yacc はあいまいな文法を処理できません。あいまいな文法 (または LALR(1) 以外の文法) を指定すると、その文法の言語のサブセットが解析されますが、それが必要な場合とそうでない場合があります。

bison を使用%glr-parserすると、あいまいな文法を解析できる glr パーサーを作成できます。%dprecただし、あいまいさを解決するには、文法の適切な場所にディレクティブとディレクティブを追加する必要があり%mergeます。そうしないと、実行時エラーが発生します。

ただし、あなたが説明した言語は特にあいまいではありません。実際、かなり自明な LALR(1) であるため、yacc で簡単に処理できます。

%token A B
%%
input: multiA | multiB | twoA | twoB ;
multiA: A | A A | A A A | A A A moreAs ;
moreAs: A | moreAs A ;
multiB: B | multiB B ;
twoA: A A A A B B ;
twoB: A A A B B B B B ;
于 2012-08-13T17:58:24.627 に答える