Open48

パーサー調査

mikimiki

パーサー・構文解析器 (Parser)

決まった文法に基づいて、データを解析して構文木を生成するプログラム

抽象構文木 (AST; Abstract Syntax Tree)

意味的な文法に基づいた構文木

具象構文木 (CST; Concrete Syntax Tree)

実際の文法に基づいた構文木

LL (LL; Left to right, Leftmost derivation)

左から右に読み込み、左から文法規則を適用する

一般化LL (GLL; Generalized LL)

LL法の構文解析をすべての文脈自由文法に拡張した

再帰下降 (Recursive descent)

関数の再帰呼び出しによって文法を再現する

パックラット (Packrat)

解析表現文法を使用する。バックトラッキングをしながら最初に成功した規則を適用する。文字列の位置について、構文解析の結果をキャッシュする

単純順位 (Simple precedence)

それぞれの記号同士で優先順位を決めて、より優先な記号を先に処理する

演算子順位 (Operator precedence)

演算子に優先順位を決めて、より優先な演算子を先に処理する

Pratt (Pratt)

演算子順位+再帰下降

LR (LR; Left to right, Rightmost derivation)

左から右に読み込み、右から文法規則を適用する

単純LR (SLR; Simple LR)

Follow集合を使って衝突を回避をする

LALR構文解析 (LALR; Look-Ahead LR)

マージされた先読み集合を使って衝突を回避する

正規LR構文解析 (CLR; Canonical LR)

先読み集合を使って衝突を回避する

一般化LR (GLR; Generalized LR)

衝突が起きた場合にすべての操作について、適用した場合のスタックを作成する

CYK (Cock-Younger-Kasami)

構文解析表 (Parse Table)

構文解析に必要な表

文脈自由文法 (CFG; Contest-Free Grammar)

A → wのような文法規則の文法

解析表現文法 (PEG; Parsing Expression Grammar)

文脈自由文法に似ている
S ← A / Bの場合、最初にAにマッチするかを試し、しなかったら次にBを試す

mikimiki

Wikipedia:ja

https://ja.m.wikipedia.org/wiki/構文解析

構文解析は、ある言語において、その形式文法に従って記号の文字列を分析する手続きである。

https://ja.m.wikipedia.org/wiki/構文解析器

構文解析器とは、構文解析をおこなうプログラム。

https://ja.m.wikipedia.org/wiki/形式文法

形式文法は、形式的に与えられた文法である。

https://ja.m.wikipedia.org/wiki/文脈自由文法

文脈自由文法は、形式言語の理論において全生成規則が以下のようである形式文法である。

V → w

https://ja.m.wikipedia.org/wiki/正規文法

正規文法は、形式文法における右正規文法と左正規文法の総称。

https://ja.m.wikipedia.org/wiki/終端記号と非終端記号

終端記号と非終端記号は、句構造規則の生成規則中にあらわれる記号類の分類である。

https://ja.m.wikipedia.org/wiki/トップダウン構文解析

トップダウン構文解析は、構文解析において、構文木を、最上位の非終端記号から始めて、それを順次右辺の記号列へと書き換えていくような手順によって導出する構文解析の戦略である。

https://ja.m.wikipedia.org/wiki/ボトムアップ構文解析

ボトムアップ構文解析は、構文解析において、構文木を、木の葉に相当する終端記号の列から始めて、それを順次左辺の非終端記号へ書き換え、最終的に最上位の非終端記号を得る、というような手順によって導出する構文解析の戦略である。

https://ja.m.wikipedia.org/wiki/再帰下降構文解析

再帰下降構文解析は、相互再帰型の手続きで構成されるLL法のトップダウン構文解析であり、各プロシージャが文法の各生成規則を実装することが多い。

https://ja.m.wikipedia.org/wiki/Prattパーサ

情報科学の分野において、 Prattパーサ は文法規則の代わりにトークンの意味ごとに関連付けを作るように改良された再帰下降構文解析のひとつ。

https://ja.m.wikipedia.org/wiki/パックラット構文解析

パックラット構文解析とは、PEGにより構文解析を行うアルゴリズムである。

https://ja.m.wikipedia.org/wiki/LL法

LL法またはLL構文解析とは、文脈自由文法のサブセットのためのトップダウン構文解析法の一種である。入力文字列を左から構文解析していき、左端導出を行う。

https://ja.m.wikipedia.org/wiki/LR法

LR法またはLR構文解析器とは、文脈自由文法の構文解析手法/構文解析器である。LR法では、入力を左から右に読んでいき、右端導出を行う。

https://ja.m.wikipedia.org/wiki/単純LR法

単純LR法とは、文脈自由文法のための構文解析手法である。

https://ja.m.wikipedia.org/wiki/LALR法

LALR法は、構文解析手法の一種であり、Lookahead LR法の略である。

https://ja.m.wikipedia.org/wiki/正規LR法

計算機科学において、正規LR法、LR(1)法、正規LR構文解析器、LR(1)構文解析器とは、k=1の場合におけるLR(k)、すなわち、終端記号1つを先読みする構文解析手法/構文解析器である。

https://ja.m.wikipedia.org/wiki/GLR法

GLR法または一般化LR法とは、非決定的で曖昧な文法を扱うようLR法を拡張したものである。

https://ja.m.wikipedia.org/wiki/アーリー法

アーリー法は、チャートパーサの一種であり、主に計算言語学での構文解析に使われる。

https://ja.m.wikipedia.org/wiki/CYK法

CYK法は、ある文字列が与えられた文脈自由文法で生成できるかを決め、生成できる場合の生成方法を求めるアルゴリズムである。

mikimiki

Wikipedia:en

https://en.m.wikipedia.org/wiki/Parsing_expression_grammar
https://en.m.wikipedia.org/wiki/LALR_parser
https://en.m.wikipedia.org/wiki/Shift-reduce_parser
https://en.m.wikipedia.org/wiki/Bottom-up_parsing
https://en.m.wikipedia.org/wiki/Parsing
https://en.m.wikipedia.org/wiki/Formal_grammar
https://en.m.wikipedia.org/wiki/Syntax
https://en.m.wikipedia.org/wiki/Parse_tree
https://en.m.wikipedia.org/wiki/Context-free_grammar
https://en.m.wikipedia.org/wiki/Terminal_and_nonterminal_symbols
https://en.m.wikipedia.org/wiki/Earley_parser
https://en.m.wikipedia.org/wiki/LR_parser
https://en.m.wikipedia.org/wiki/LL_parser
https://en.m.wikipedia.org/wiki/LL_grammar
https://en.m.wikipedia.org/wiki/Deterministic_context-free_grammar
https://en.m.wikipedia.org/wiki/Recursive_descent_parser
https://en.m.wikipedia.org/wiki/Top-down_parsing
https://en.m.wikipedia.org/wiki/Left_recursion
https://en.m.wikipedia.org/wiki/Comparison_of_parser_generators
https://en.m.wikipedia.org/wiki/Regular_grammar
https://en.m.wikipedia.org/wiki/Context-sensitive_grammar
https://en.m.wikipedia.org/wiki/Abstract_syntax_tree
https://en.m.wikipedia.org/wiki/LALR_parser
https://en.m.wikipedia.org/wiki/Operator-precedence_parser
https://en.m.wikipedia.org/wiki/Operator-precedence_grammar
https://en.m.wikipedia.org/wiki/Ambiguous_grammar
https://en.m.wikipedia.org/wiki/Simple_LR_parser
https://en.m.wikipedia.org/wiki/Canonical_LR_parser
https://en.m.wikipedia.org/wiki/GLR_parser
https://en.m.wikipedia.org/wiki/Left_corner_parser

mikimiki

SDT Syntax directed translation 構文指示変換

mikimiki

合成属性と継承属性

合成属性(Synthesized attributes)は左辺にある非終端記号の属性
A → BC でAの属性がBとC(子)に依存している

継承属性(Inherited attributes)は右辺の非終端記号の属性
A → BC でBの属性がA(親)やC(兄弟)に依存している

mikimiki

SDD Syntax Directed Definitions
構文指向定義

mikimiki

BNF

https://ja.wikipedia.org/wiki/バッカス・ナウア記法
https://ja.wikipedia.org/wiki/EBNF
https://ja.wikipedia.org/wiki/ABNF

文脈自由文法の定義に使われる記法

  • 連結 A , B Aの後にB
  • 選択 A | B AまたはB
  • 省略可能 [A] Aが0回または1回
  • 繰り返し A* Aが0回以上
  • 必須繰り返し A+ Aが1回以上
  • グループ (A) A
digit = "0" | "1" ;
digits = "0" | "1" , digit* ;
digits with underscore = digits , ( "_" , digit+ )* ;
  • 連結 A B Aの後にB
  • 選択 A / B AまたはB
  • 省略可能 [A] Aが0回または1回
  • 繰り返し a*bA Aがa回以上b回以下
  • グループ (A) A
zero = %x30 ; 0
one = %x31 ; 1
digit = zero / one
digits = zero / ( one *digit )
digits with underscore = digits *( "_" 1*digit )
mikimiki

文脈自由文法

Context-Free Grammar (CFG)

X → aBc のような生成規則の集まり
左辺は1個の非終端記号、右辺は0個以上の非終端記号と終端記号の並び
左辺に同じ非終端記号がある生成規則もある

mikimiki

曖昧な文法

複数の構文木が同じ文字列を表すことがある文法

mikimiki

BNF → CFGの変換

  • 選択
X = A | B ;
X → A
X → B
  • 省略
X = [A] ;
X → A
X → ε

(ε(イプシロン)は空の文字列を表す)

  • 繰り返し
X = A* ;
X → ε
X → A X
(X → X A も可能)
  • グループ
X = (A B) ;
X → X2
X2 → A B
mikimiki

LL法

Left-to-right Leftmost Derivation
文字列を左から右へ読み、左の構文から解析していく

https://ja.wikipedia.org/wiki/LL法
https://en.wikipedia.org/wiki/LL_parser

LLの実装

  1. LL解析表を作成する
  2. スタックを用意して、$(文字列の終わり記号)、S(開始記号)の順に追加する
  3. スタックのトップを見て
    • 非終端記号なら
      1. 入力文字列から1つ先読みする
      2. スタックのトップを取り出す
      3. LL解析表からスタックのトップと先読みした文字に対応した生成規則を見つける
      4. 見つけた生成規則を出力し、右辺の記号列を逆順でスタックに追加する
      5. 見つからない場合、解析エラー
    • 終端記号なら
      1. 入力文字列を1つ読み進める
      2. 読んだ文字とスタックのトップを比較して、等しいならスタックのトップを取り出す
      3. 等しくない場合、解析エラー
    • $なら
      1. 文字列が終端の場合、解析を成功して終了
      2. 終端でない場合、解析エラー
  4. 3を停止するまで繰り返す
mikimiki

i 番目の生成規則を A_i → w_i とする
A_i は1個の非終端記号、 w_i は0個以上の非終端記号、終端記号の列

LL(1)解析表の作成

  1. すべての生成規則のFirst集合 Fi(w_i) を求める
  2. すべての生成規則のFollow集合 Fo(A_i) を求める
  3. 解析表を作成する
    以下の時、表の[A, a]はA→wを持つ
    • Fi(w) がaを含む
    • Fi(w) がεを含み、 Fo(A) がaを含む

First集合