1. はじめに
この記事はeeic2022の3年後期実験「大規模ソフトウェアを手探る」の4班の成果報告の記事です。
CPythonのビルドが済んでいない方は、先に以下の記事を参考にしてください。私たちの班が書いた記事です。
また、Cpythonにインクリメントも追加してみたい方は以下の記事を参考にしてください。こちらも私たちの班が書いた記事になっています。
2. 実行環境
Ubuntu 20.04.5 LTS
Python 3.10.8
3. こんな方におすすめ
C言語 → '&&', '||'
Python → 'and', 'or'
この使い分けがごっちゃになるという方におすすめです。
この記事通りの変更を施せば、CPythonでどちらの表現も使えるようになります。
4. /Grammar/Tokens (変更1)
コメントで示した行を書き加えることで、新たな演算子を定義します。
演算子の順番は関係ありません。
ELLIPSIS '...'
COLONEQUAL ':='
AND_AND '&&' # 追加
OR_OR '||' # 追加
make regen-token
を実行することで、Token(演算子)として正式に定義されます。(後述)
5. /Grammar/python.gram (変更2)
コメントで示した行を書き加えることで、'&&'という演算子に「かつ」を意味する機能を与えます。
'and'と同じ機能にしたいので、'and'に関する記述から演算子だけを書き変えた記述を加えればいいです。
ショートカットキーCtrl+F
で文字検索すると該当箇所がすぐに見つかります。
conjunction[expr_ty] (memo):
| a=inversion b=('and' c=inversion { c })+ { _PyAST_BoolOp(
And,
CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
EXTRA) }
| a=inversion b=('&&' c=inversion { c })+ { _PyAST_BoolOp( # 追加
And, # 追加
CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), # 追加
EXTRA) } # 追加
| inversion
同様にして、'||'という演算子にも「または」を意味する機能を与えます。
disjunction[expr_ty] (memo):
| a=conjunction b=('or' c=conjunction { c })+ { _PyAST_BoolOp(
Or,
CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
EXTRA) }
| a=conjunction b=('||' c=conjunction { c })+ { _PyAST_BoolOp( # 追加
Or, # 追加
CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), # 追加
EXTRA) } # 追加
| conjunction
make regen-pegen
を実行することで、正式に機能が付与されます。(後述)
これにてソースコードの変更は終了です。
6. 再ビルド
ターミナルにてCPythonのソースコードがあるディレクトリに移動し、以下のコマンドを順に実行します。
$ make regen-token
$ make regen-pegen
$ make
$ make install
7. デモ
ビルドしてできたディレクトリに移動すると、「bin」というディレクトリがあります。
その中に入ると「python3」というファイルがあるので、それを実行します。
私の場合は「~/2022cpython/bin/python3」となっています。
たしかに'&&', '||'が追加されていることがわかります。
8. 最後に
CPythonの文法を変更するにあたってこちらのサイトが非常に役立ちました。ぜひ読んでみてください。