Anaconda 学習:PLY ( Python Lex-Yacc )

2018-04-25 :  PCクリニック
ふと、Python でマクロ処理が出来ないのか?

と云うことで、

「Python macro statement」と検索してみた。

“stackoverflow”の
Implementation of a C pre-processor in Python or JavaScript?
が見つかった。これ、そのものズバリの質問。

で、
[13]の最終段では、

 The PLY (Python Lex and Yacc) tools include a cpp implemented in Python.

また、
回答[6]では、

 Check out PLY, an implementation of Lex and Yacc on Python which ・・・


面白そうなので、見に行ってみた。

GitHub の、
dabeaz/ply
  Python Lex-Yacc http://www.dabeaz.com/ply/index.html

で、このリンク先は:
PLY (Python Lex-Yacc)
ですね。


Anaconda では、どうなっているのか?

  ply 3.10 がデフォルトで入っている。

ドキュメントサイトは、

  PLY (Python Lex-Yacc)


そして、
最初のdabeaz/plyの example / calc フォルダにある、
「calc.py」プログラムをコピー&ペーストして、テスト実行。

動きますね。

変数が使え、括弧の処理もある、計算機(言語仕様)を自作する。


そこで、Lex、Yacc について学習。


元々は?
プログラミング言語を作る/yaccとlex

  Cでプログラミング言語の処理系を実装するのであれば、
  多くの場合、yaccとlexというツールを使います。

  実のところ、Cとyacc/lexで簡単なプログラミング言語を作る、
  というのは、以前、「C言語ヨタ話 」で書いた「 電卓を作ってみよう」
  の焼き直しになります。yaccとlexの説明もそちらに簡単に書いたので、
  そちらを見てください――と言いたいところですが、まあここでも軽く
  説明します。 内容的には重複、というかコピペしている部分もありますが。
   プログラミング言語の処理系は、通常、以下のような手順を取ります。

  字句解析
    ソースプログラムを、「字句(トークン)」の並びに分割する処理です。
  構文解析
    トークンの並びから、解析木を構築する処理です。

  この後、Cなどの機械語を吐くコンパイラや Javaのようなバイトコードを
  吐くコンパイラなら、 「コード生成」という処理が入りますが、
  今回は、解析木を作ったらそのまま実行しますから、
  コード生成の処理は入りません。
   たとえば、前述の以下のようなソースについて、

    ・・・・・
    ・・・・・

  字句解析を行なうと、以下のようなトークンに分割されます
  (この箱ひとつひとつがトークンです)。

    ・・・・・
    ・・・・・

  これを構文解析して解析木を構築すると、以下のようになります。

    ・・・・・
    ・・・・・

  字句解析を行なうプログラムのことを、
  レキシカルアナライザ(lexical analyzer) と呼びますが、
  これを自動生成してくれるのがlexです。

  また、前述のように、構文解析を行なうプログラムのことを
  パーサ(parser)と呼びます。
  yaccはこれを自動生成してくれるプログラムです。

  yacc, lexともに、それ専用の定義ファイルを入力とし、
  Cのソースを出力します。

  ・・・・・
  ・・・・・



Python のPLY については、

Python PLY - MyMemoWiki

  Pure Pythonによる、lex および yacc の実装

  PLYは、lex.py および yacc.py の 2つのモジュールを
   ply パッケージに含んでいる。

  2つのツールは協調して作業を行う

  lex.py
  モジュールは入力されたテキストを 正規表現により定義された
   字句のコレクションに分解する。
  次の有効なトークンを入力ストリームから返す、token()関数を、
   外部にインターフェースとして提供する。

  yacc.py
  自由文法として定義された言語の構文を評価する。
  LR で解析を行い、LALR(1) (デフォルト) もしくは
   SLR アルゴリズムでパースする。
  lex.py の token()を繰り返し呼び出し、トークンを参照し、
   文法ルールを呼び出す。
  出力は、大抵、抽象構文木(AST)となる。



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180316
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
04 | 2018/05 | 06
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク