言語にある文字列を構築できるようにするために、それらが必要ですL
。
B --> aBb | A
は、非終端記号がある場合、またはB
で置き換えることができることを意味します。(大文字は非終端記号を表し、小文字は終端記号を表します)。aBb
A
文法を見てみましょう:
S --> B | ^
B --> aBb | A
A --> aA | a
なぜ私たちは持っているの| ^
ですか?空の文字列を生成できるようにするために必要です。空の文字列はL
、同じ量の と が含まれているためa
、明らかに言語の一部ですb
。
なぜ私たちは持っているの| A
ですか?のルールを使用できるようにしますA
。に置き換えることがB
できるので、 または のいずれかA
を挿入できます。s よりもsが多い文字列を生成できるようにするには、このルールが必要です。aA
a
a
b
なぜ私たちは持っているの| a
ですか?置換が必要な新しい非終端記号を追加A
せa
ずに置換できるようにする。
この文法を見ると、 s とs の量が等しい文字列を生成できるように変更A --> aA | a
する必要があると言えます。(したがって、余分な を追加する代わりに、空の文字列 (または null) に置き換えることができます)A --> aA | a | ^
a
b
A
a
文字列を生成したいとしましょうaaabb
:
S //You start with S
B //Rule: S --> B
aBb //Rule: B --> aBb
aaBbb //Rule: B --> aBb
aaAbb //Rule: B --> A
aaabb //Rule: A --> a