Skip to content

marionette-of-u/kp19pp

Repository files navigation

概要

LALR(1) パーサジェネレータ.
継承元プロジェクト「caper」(http://caper.googlecode.com/svn/trunk/caper/site/caper.html
本プログラムはcaperに若干の高速化(漸近的には同等)と, 終端記号の優先順位を付与する事による曖昧さ回避及び限定的な衝突回避の改良を加えたものである.

動作確認

CompilerMSVC 12.0
LibBoost 1.53.0

使い方

実行ファイルの生成

各.cppファイルを上記のコンパイラまたは上記と互換性のあるコンパイラでコンパイル.

parserの生成

kp19pp [ options ] ifile ofile

C++のコード生成をする場合は-c++,
Haskellのコード生成をする場合は-haskell,
Vim scriptのコード生成をする場合は-vimscript,
ログを出力する場合は-log,
処理時間を出力する場合は-time[ options ]に追加.

入力

フォーマット

< token-header > token-prefix {
    < link-direction >{
        terminal-symbol < terminal-symbol-type > ... terminal-symbol < terminal-symbol-type > ;
    }
    terminal-symbol < terminal-symbol-type > ... terminal-symbol < terminal-symbol-type > ;
}

< grammar-header > namespace {
    nonterminal-symbol < nonterminal-symbol-type >
        : [ semantic-action ] symbol < arg-num > ... symbol < arg-num >
        | [ semantic-action ] symbol < arg-num > ... symbol < arg-num >
        | [ semantic-action ] < precedence-symbol > symbol < arg-num > ... symbol < arg-num >
        | [ semantic-action ] symbol [ q-semantic-action ] < q-type > quantification
        ;
}

終端記号定義部

カンマで記号を区切る事により, 同じ優先順位の終端記号を定義する.
セミコロンで列を区切る事により, 次の優先順位の終端記号の列を定義する.
< terminal-symbol-type >は必須ではない.
終端記号は文法定義部にシーケンスとして記述されなくても, 単に規則の優先順位を変更するためだけに存在しても良い
(後述:文法定義部, < precedence-symbol >).

  • token-header
    "token_desc"もしくは"token_asc". 前者の場合, 終端記号定義部での終端記号優先順位は降順に, 後者の場合は昇順になる.

  • token-prefix
    トークンのenumの型名及びトークンのprefixとなる. 省略すると自動的に"token"に設定される.

  • link-direction
    "left"もしくは"right"もしくは"nonassoc". 終端記号の結合方向を定める.

  • terminal-symbol
    終端記号.

  • < terminal-symbol-type >
    終端記号の型. 文法定義部で引数を取る終端記号は必ず型がなければならない.

文法定義部

ここでは非終端記号を定義する事によって文法を定める.
非終端記号には必ず型がなければならない.
最初に現れた非終端記号が文法全体のrootとなる.

  • < grammar-header >
    "grammar"のみ. 将来的に拡張される可能性がある.

  • namespace
    出力されるパーサーを含む名前空間.

  • nonterminal-symbol
    非終端記号.

  • < nonterminal-symbol-type >
    直前の非終端記号の型名となる.

  • [ semantic-action ]
    規則が受理された時に動作するセマンティックアクション.

  • symbol
    終端記号あるいは非終端記号.

  • < arg-num >
    セマンティックアクションの何番目の引数となるかを表す数値.
    省略した場合はその記号は引数として扱われない.

  • < precedence-symbol >
    終端記号precedence-symbolが与えられた規則は強制的にその終端記号の優先順位に変更される.

  • q-type
    量化子修飾によって示される型.

  • q-semantic-action
    量化子修飾のマッチ時に動作するセマンティックアクション.

  • quantification
    量化子修飾. 以下の演算子が利用可能.
    ?, *, +
    それぞれ0回か1回の繰り返しにマッチ, 0回以上にマッチ, 1回以上にマッチとなる.

ライセンス

同リポジトリのLICENSES参照.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published