Python

【手順】Pythonのpyparsingの使い方。Android.bpを解析してみた

2020年10月29日

PYTHONのpyparsingとは?

概要

The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. The pyparsing module provides a library of classes that client code uses to construct the grammar directly in Python code.
引用:https://github.com/pyparsing/pyparsing

和訳

pyparsingモジュールは、単純な文法を作成および実行するための代替手段です。従来の Lex / yacc、または正規表現使った手段とは異なります。 pyparsingモジュールは、Pythonコードで構文解析用の文法を記述できるようにするためのクラスを提供します。

SANACHAN
SANACHAN
う~ん、つまり、文法をPythonで記述するだけで、簡単な構文解析が行えるようになるライブラリです。

 

ライセンス

MIT License が適用されています。

ライセンスの詳細は、こちら(https://ja.wikipedia.org/wiki/MIT_License)。

 

pyparsingを使ってAndroid.bpを構文解析

Senierさんの gnoos を参考に、pyparsingを使ってAndroid.bpを構文解析する方法を紹介します。

gnoosは、AGPLv3ライセンスです。

 

ディレクトリ構成

  1. GitHub - pyparsing から取得した pyparsing フォルダーを配置する
  2. 解析する対象の Android.bp ファイルを直下に配置する
  3. 後述する BpParser.py を直下に配置する
 ディレクトリ構成
|-  BpParser.py  (mainプログラム)
|-  Android.bp   (解析対象のファイル)
|-  pyparsing/   (GitHubから取得したpyparsing)
|    |-  __init__.py
|    |-  actions.py
|    |-  common.py
|    |-  core.py
|    |-  exceptions.py
|    |-  helpers.py
|    |-  results.py
|    |-  testing.py
|    |-  unicode.py
|    |-  util.py

 

使い方

以下のようにコマンドを入力し、構文解析を実行します。

 command
$ python BpParser.py Android.bp

 

解析対象のAndroid.bp

Android10 にある Android.bp を解析します。

Soongビルドシステムで使用する Blueprint で記述された Android.bp(Makefileの代わり)の構文は>>こちら<<を参照。

スポンサーリンク

解析プログラム BpParser.py

gnoos から、最低限必要な部分を抜粋しています。

SANACHAN
SANACHAN
コピーレフトのため、紹介する BpParser.py も AGPLv3 ライセンスになります。

 

実行結果

 command
$ python BpParser.py Android.bp
('cc_library_shared',
{'cppflags': ['g-Wall', 'g-Werror', 'g-fexceptions'],
'export_include_dirs': ['gsrc'],
'name': 'glibxmlrpc++',
'rtti': True,
'srcs': ['gsrc/**/*.cpp'],
'target': {'darwin': {'enabled': False}}})
('cc_binary',
{'cppflags': ['g-Wall', 'g-Werror', 'g-fexceptions'],
'name': 'glib',
'rtti': True,
'srcs': ['gsrc/**/*.cpp']})

 

プログラムの解説

Android.bp の構文は、Google(https://source.android.com/setup/build)が公開しており、これを参照して構文解析するための文法を記述していきます。

 

型は5種類が定義されており、それぞれ pyparsing に渡す文法は以下の通りです。

  • ブール値(true または false
  • 整数(int
  • 文字列("string"
  • 文字列のリスト(["string1", "string2"]
  • マップ({key1: "value1", key2: ["value2"]}

 

 

演算子

+ 演算子を使用して、文字列、文字列のリスト、マップを結合することができます。

 

また、+= 演算子を使って値を拡張することができます。

スポンサーリンク

マップ(型:maps)

マップは、「{ name1: "data", name2: "data2", ...}」で定義されます。また、値に代入する際は、「name1 = data1」とAndroid.bpに記述することができます。

 

Module Type の定義

Android.bp では、ModuleType を定義してその後に設定のマップを記述します。

 

コメントの排除

Android.bp ファイルには、C スタイルの複数行コメント(/* */)と C++ スタイルの単一行コメント(//)を記述できます。

 

以上、「【手順】pyparsingの使い方。Android.bpを解析してみた」でした。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-Python
-, ,