このトピックでは、文章校正の定義に関する制限を説明します。
このトピックを理解するためには、以下のトピックを理解しておく必要があります。
このトピックは、以下のセクションで構成されます。
Grammar インスタンスが完了し字句構文アナライザーを生成するために使用される場合、有効な状態である必要があります。特定のものは許可されません。これは、論理矛盾であるか、アナライザーを作成するために必要な十分な情報が欠如しているためです。文章校正
を不正にする条件を示します。
LexerState.Symbols コレクションが空であるとさほど有用ではありません。レクサー状態にある端末記号がないと、 Grammar.UnrecognizedSymbol に関連づけられるトークンしか作成できず終了できません。したがって、各レクサー状態には 1 つ以上の終端記号を含める必要があります。
NonTerminalSymbol.Rule が null
。すべての非終端記号は、1 つ以上の生産を持つ必要があります。このためルール ツリー内に 1 つ以上のルールが必要です。非終端記号に一致するものがない場合 (Visual Basic で引数が省略される、等)、Rule
は EmptySyntaxRule のインスタンスに設定しなければなりません。
非終端記号のルール ツリーにおけるルールは、以下のいずれかの条件に基づいて無効です。
AlternationSyntaxRule または ConcatenationSyntaxRule は 2 つの子ルールより少なくなります。これらのルールは複数のルールを含むことを意味します。オルタナティブ ルールおよび複数のルールに使用しなければならない多くのオプションのうちの 1 つは、連結ルールのために連結しなければなりません。これらのルールにゼロまたは 1 つの子ルールを含めるという意味ではありません。
ExceptionSyntaxRule は、null
の Exception プロパティまたは Rule プロパティがあります。
ExceptionSyntaxRule.Exception
プロパティは、1 つ以上の再帰定義記号を含めるルール ツリーです。再帰は構文例外では許可されません。これには、繰り返し記号 (再帰的に定義された生産が内部に必要) が含まれます。このため、以下の生産は文章校正上は無効です。
RestrictedBlock → Block-{Statement}
この偽生産はマイナス記号「-」を使用して構文例外を示し、大括弧は繰り返しを示します。
* ExceptionSyntaxRule
には、Rule
から何も許可しない Exception
があります。たとえばこの生産では、
Nothing → Statement-Statement
基本的に述べているのは「ステートメント」が「ステートメント」でない限り「ステートメント」になることができるものはない、ということです。これは論理的に矛盾しています。何もないものをドキュメント内に見つけることはできないためです。この種の直接的な矛盾は、おそらく偶発的や故意なものではなく無意識に矛盾が作成された可能性があります。より複雑な矛盾の例があります。
Letter → a|b|c|…|z
AThruM → a|b|c|…|m
NThruZ → n|o|p|…|z
RestrictedLetter → Letter-(AThruM|NThruZ)
「RestrictedLetter」には矛盾があり文章校正が無効になります。
* FactorSyntaxRule には null
Rule
プロパティがあります。
* OptionalSyntaxRule には null
Rule
プロパティがあります。
* RepetitionSyntaxRule には null
Rule
プロパティがあります。
* SymbolReferenceSyntaxRule には、文章校正に属さない記号があります。
* SymbolReferenceSyntaxRule
は Grammar.EndOfStreamSymbol を参照し、所有する非終端記号は Grammar.StartSymbol ではありません。開始記号のみがドキュメントの終わりを示す記号を期待します。別の記号がその生産のいずれかで使用するのは意味をなしません。定義ではドキュメントの内側のどこかであるためです。開始記号の使用方法に対する制限さえあります。開始記号は、以下のフォームの 1 つの生産のみである場合にストリーム記号の終わりを参照するのみです。
StartSymbol → SomeOtherNonTerminalSymbol EndOfStreamSymbol
複数の生産がある、本文内に 2 つ以上の記号がある、その生産本文に自身を参照している、または本文内で EndOfStreamSymbol
が最初になる必要がある場合、ルールも文章校正も無効になります。文章校正ライターがその開始記号を 2 つ以上の記号を参照する、再帰を使用する、または複数の生産を持つ場合、EndOfStreamSymbol を参照しなければ簡単に行うことができます。
StartSymbol →
StartSymbol → Symbol1 StartSymbol Symbol2
そして内部的に文章校正はこのように「解決された」開始記号を作成します。
ResolvedStartSymbol → StartSymbol EndOfStreamSymbol
SymbolReferenceSyntaxRule
は文章校正のための解決済み開始記号を参照します。文章校正ライターが開始記号を整えて成形するよう指定する場合、つまり EndOfStreamSymbol
が後に続く別の非終端記号への参照を求める単一の ConcatenationSyntaxRule
を所有する場合、Syntax Parsing Engine は文章校正用に解決済み開始記号を作成しません。これらの開始記号は解決済み開始記号として使用されます。その場合、その生産本文に開始記号を参照できる非終端記号は他にありません。解決済み開始記号は、直接的または間接的に再帰定義の一部となることはありません。
ドキュメントの構文を解析するための 1 つの方法は、開始記号を字句アナライザーからトークンのシーケンスに対応する終端記号のシーケンスに導出することです。導出は開始記号で始まり、各非終端記号がその生産本文のいずれかによって置換されるステップのセットです。新しいシーケンスでは、ヘッドのあった場所に生産本文を置き、非終端記号がまだ存在する場合は、残っているのが終端記号のみになるまで生産本文で置換します。完全に導出できない開始記号を定義する可能性があり、導出手順シーケンスはそのため無限です。以下のクラスを検討します。
StartSymbol → GroupedContent
GroupedContent → (Parens | Brackets)
Parens → OpenParenToken GroupedContent CloseParenToken
Brackets → OpenBracketToken GroupedContent CloseBracketToken
開始記号が終端記号のみのシーケンスに導出するようにする方法はありません。「親の」または「ブラケットの」非終端記号を代用するたびに別の「GroupedContent」の非終端記号が記号シーケンスに残ります。
このトピックの追加情報については、以下のトピックも合わせてご参照ください。