Type 3 Grammarがある場合、プッシュダウンオートマトンで(スタックで操作を行わずに)表現できるため、コンテキストフリー言語を使用して正規表現を表現できます。しかし、解析テーブルを構築せずに、タイプ3の文法が、LL(1)、SLR(1)などであるかどうかを知ることはできますか?
Type 3 Grammarがある場合、プッシュダウンオートマトンで(スタックで操作を行わずに)表現できるため、コンテキストフリー言語を使用して正規表現を表現できます。しかし、解析テーブルを構築せずに、タイプ3の文法が、LL(1)、SLR(1)などであるかどうかを知ることはできますか?
回答:
すべての通常言語にはLL(1)文法があります。このような文法を取得するには、通常の言語のDFAを取得し(おそらく、正規表現から取得したNFAのサブセット構築を行うことにより)、それを右再帰的な正規の文法に変換します。この文法はLL(1)になります。これは、同じ非終端記号の生成のペアが異なるシンボルで始まるか、εを生成し、先読みトークンとして$を持っているためです。したがって、LL(1)の文法はすべてLR(1)であるため、すべての通常言語もLR(1)です。さらに、このペーパーの重要な結果を使用すると、LR(1)言語にはSLR(1)文法があり、通常の言語にはSLR(1)文法があることがわかります。
ただし、通常の言語はすべてLR(0)ではありません。LR(0)言語には非常に固有のプロパティがあります。特に、プレフィックスのないものでなければなりません。したがって、正規言語{a、aa}はLR(0)ではありませんが、明らかに規則的です(regex a |(aa))。ただし、LR(0)言語は通常の言語に適切に含まれていません。{0 n 21 n | n≥1}はLR(0)ですが、言語は規則的ではありません。
S -> E
E -> 0E1 | 2
お役に立てれば!
(プレーン)正規表現の構文(「表現」と言いました)はLR(0)です。正規表現を表す文字列を解析するために先読みする必要はありません。正規表現の文法でパーサージェネレーターを実行することで、これを簡単に決定できます。-}正規表現用の単純な再帰降下(LL(0))パーサーを簡単にコーディングすることもできます。LL(0)であるものはすべてLR(0)です。
Perlのようなもっと複雑ないわゆる「正規表現」の構文がこのようなものかどうかはわかりません。しかし、Perlの正規表現は正規表現よりも厳密に強力であるため、単純な古い正規表現ではありません。
文法に何らかのプロパティがあるかどうかを判断するには、何らかの述語を実行する必要があります。(S)LR(k)であるかどうかを判断するには、そのプロパティをチェックできる述語を実行する必要があります。実際には、そのような述語は、それらが定義されている方法のために、実際に解析テーブルを構築する必要があります。
a|(aa)
は接頭辞フリーではない言語を記述します。さらに、LR(0)言語はイプシロンプロダクションで文法を処理できないため、通常の言語{epsilon、a}はLR(0)ではありません。ただし、通常の言語は LL(1)です。これは、通常の文法として記述できるため、すべてLR(1)であるためです。LR(1)言語にはSLR(1)文法があるため、これはすべての標準言語がSLR(1)であることを意味します。