2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CPythonに'&&', '||'を追加してみた

Last updated at Posted at 2022-11-09

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」となっています。
and_or.jpg
たしかに'&&', '||'が追加されていることがわかります。

8. 最後に

CPythonの文法を変更するにあたってこちらのサイトが非常に役立ちました。ぜひ読んでみてください。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?