単純優先順位文法

コンピュータサイエンスにおいて単純優先順位文法は、単純優先順位パーサで解析できる文脈自由 形式文法です[1] この概念は1964年にクロード・ペアによって初めて考案され、[2]その後、ロバート・フロイドのアイデアから、ニクラウス・ヴィルトとヘルムート・ウェーバーによって再発見されました。彼らは1966年にCommunications of the ACM「EULER:ALGOLの一般化とその形式的定義」と題された論文を発表しました[3]

形式的定義

P内のすべての生成規則が以下の制約に従う 場合、 G = ( N、Σ、PS ) は単純優先順位文法です。

優先順位表

単純優先順位パーサー

単純優先順位パーサは、文脈自由文法用のボトムアップパーサの一種で、単純優先順位文法でのみ使用できます。

パーサの実装は、汎用ボトムアップパーサと非常によく似ています。スタックは、右端の導出から文形式の有効な接頭辞を格納するために使用されます。記号 ⋖、≐、および ⋗ は、ピボットを識別し、いつシフトするか、いつリダクションするかを判断するために使用されます。

実装

  • 初期記号 S を持つ文法のヴィルト・ウェーバーの優先順位関係表を計算します。
  • 開始マーカー$でスタックを初期化します
  • 解析対象の文字列 (入力)に終了マーカー$を追加します
  • Stackが「$ S」に等しく、Inputが「$」に等しくなるまで
    • Top(スタック)とNextToken(入力)の関係をテーブルで検索する
    • 関係が⋖または≐の場合
      • Shift
      • Push(スタック、関係)
      • Push(スタック、NextToken(入力))
      • RemoveNextToken(入力)
    • 関係が⋗の場合
      • Reduce
      • SearchProductionToReduce(スタック)
      • スタックからピボットを削除する
      • 生成規則の非終端記号とスタックの最初の記号の関係をテーブルで検索する(上から開始)
      • Push(スタック、関係)
      • Push(スタック、非終端記号)

SearchProductionToReduce(スタック)

  • スタックの最上位の⋖を見つける。これとそれより上のすべての記号がピボットである。
  • ピボットを右側に持つ文法の生成規則を見つける。

乗算と加算の演算を含む算術式を解析できる次の言語があるとする。

E --> E + T' | T'T' --> TT --> T * F | FF --> ( E' ) | numE' --> E

numは終端記号であり、字句解析器は任意の整数をnumとして解析します。E算術式、Tは項、Fは因数です。

解析表:

EE'TT'F+*num$
E
E'
T
T'
F
+
*
(
)
num
$
スタック優先順位入力アクション
$2 * (1 + 3)$シフト
$ ⋖ 2* (1 + 3)$REDUCE (F -> num)
$ ⋖ F* (1 + 3)$REDUCE (T -> F)
$ ⋖ T* (1 + 3)$シフト
$ ⋖ T ≐ *(1 + 3)$シフト
$ ⋖ T ≐ * ⋖ (1 + 3 )$シフト
$ ⋖ T ≐ * ⋖ ( ⋖ 1+ 3 )$4× (F -> num) (T -> F) (T' -> T) (E -> T ') を減算する
$ ⋖ T ≐ * ⋖ ( ⋖ E+ 3 )$シフト
$ ⋖ T ≐ * ⋖ ( ⋖ E ≐ +3 )$シフト
$ ⋖ T ≐ * ⋖ ( ⋖ E ≐ + < 3)$3× 減算 (F -> num) (T -> F) (T' -> T)
$ ⋖ T ≐ * ⋖ ( ⋖ E ≐ + ≐ T)$2× 減算 (E -> E + T) (E' -> E)
$ ⋖ T ≐ * ⋖ ( ≐ E')$シフト
$ ⋖ T ≐ * ⋖ ( ≐ E' ≐ )$減算 (F -> ( E' ))
$ ⋖ T ≐ * ≐ F$減算 (T -> T * F)
$ ⋖ T$2×減算 (T' -> T) (E -> T')
$ ⋖ E$承認

ヴィルト-ウェーバーの先行関係

コンピュータサイエンスにおいて形式文法が単純優先文法であるかどうかを判断するには、記号のペア間のヴィルト=ウェーバー関係が必要です。このような場合、単純優先パーサーを使用できます。この関係は、コンピュータ科学者のニクラウス・ヴィルトとヘルムート・ウェーバーにちなんで名付けられました。

目標は、実行可能な接頭辞がピボットを持ち、縮小する必要がある時期を特定することです。Aはピボットが見つかったことを意味し、Aは潜在的なピボットが始まっていることを意味し、Aは同じピボットに関係が残っていることを意味します。

形式的定義

優先関係計算アルゴリズム

記号に対して3つの集合を定義します。

Xが終端記号の場合、 Head * ( X )はXであり、Xが非終端記号の場合、Head * ( X )はHead + ( X )に属する終端記号のみを含む集合です。この集合はLLパーサーで説明されているFirst-setまたはFi( X )と同等です
Xが終端記号の場合、 Head + ( X )とTail + ( X )は∅です。

関係を計算するための擬似コードは次のとおりです。

  • RelationTable := ∅
  • 各生成規則について
    • α内の隣接する2つの記号XYについて
      • add(RelationTable, )
      • add(RelationTable, )
      • add(RelationTable, )
  • add(RelationTable, ) ここで、Sは文法の最初の非終端記号、$は限界マーカーです
  • add(RelationTable, ) ここで、Sは文法の最初の非終端記号、$は限界マーカーです
およびは、定義されたとおりに要素ではなく集合で使用されるため、この場合、集合/要素間のすべての直積を加算する必要があります。

例1

  • 頭部+ ( a ) = ∅
  • 頭部+ ( S ) = { a, c }
  • 頭部+ ( b ) = ∅
  • 頭部+ ( c ) = ∅
  • 尾部+ ( a ) = ∅
  • 尾部+ ( S ) = { b, c }
  • 尾部+ ( b ) = ∅
  • 尻尾+ ( c ) = ∅
  • * ( a ) = a
  • 先頭* ( S ) = { a, c }
  • 先頭* ( b ) = b
  • 先頭* ( c ) = c
    • a Sの隣
    • S Sの隣
    • S bの隣
    • 記号は1つしかないので、関係は追加されません。
優先順位表

例2

  • 先頭+ ( S ) = { a, [ }
  • 先頭+ ( a ) = ∅
  • 先頭+ ( T ) = { b }
  • 先頭+ ( [ ) = ∅
  • 先頭+ ( ] ) = ∅
  • 先頭+ ( b ) = ∅
  • 末尾+ ( S ) = { a, T, ], b }
  • 末尾+ ( a ) = ∅
  • 末尾+ ( T ) = { b, T }
  • 末尾+ ( [ ) = ∅
  • 末尾+ ( ] ) = ∅
  • 末尾+ ( b ) = ∅
  • 先頭* ( S ) = { a, [ }
  • ヘッド* ( a ) = a
  • ヘッド* ( T ) = { b }
  • ヘッド* ( [ ) = [
  • ヘッド* ( ] ) = ]
  • ヘッド* ( b ) = b
    • a Tの次
    • [ Sの次
    • S ]の次
    • b Tの次
優先順位表

注釈

  1. ^ 『構文解析、翻訳、コンパイルの理論:コンパイル』、アルフレッド・V・エイホ、ジェフリー・D・ウルマン、プレンティス・ホール、1972年
  2. ^ Claude Pair (1964). "Arbres, piles et compilation". Revue française de traitement de l'information .、英語:木、スタック、そしてコンパイル
  3. ^ Machines, Languages, and ComputationPrentice–Hall、1978年、ISBN 9780135422588 WirthとWeber [1966]はFloydの優先順位文法を一般化し、単純な優先順位文法を得た。

参考文献

  • Alfred V. Aho、Jeffrey D. Ullman (1977). Principles of Compiler Design . 第1版、Addison–Wesley
  • William A. Barrett、John D. Couch (1979)。『コンパイラ構築:理論と実践』。Science Research Associate。
  • Jean-Paul Tremblay、PG Sorenson (1985)。『コンパイラ記述の理論と実践』。McGraw–Hill。

参考文献

  • Aho、Alfred V.、Ullman、Jeffrey D.、『構文解析、翻訳、コンパイルの理論』
  • クレムソン大学の「単純優先順位関係」
Retrieved from "https://en.wikipedia.org/w/index.php?title=Simple_precedence_grammar&oldid=1316999801#Simple_precedence_parser"